22.12.03 배운 내용 정리
(반복문, 클래스, 객체)
반복문
반복문 = 반복 되는 일을 처리하기 위해 사용하는 것
반복문의 종류 = While문, do-while문, for문
while문
while문 = 조건식이 참인 동안 수행문을 반복 수행
※ while문 구조
while(조건식) { // 조건식이 참인동안 블록{ } 반복수행
수행문1;
...
}
수행문2;
...
※ 1~10까지 더하는 프로그램을 while문으로 만들기
'1부터 10까지 숫자가 커지는 동안'을 조건으로하고, 1씩 증가한 숫자를 더하는 작업을 함.
1씩 늘려 나갈 변수를 하나 선언하고, 증가한 숫자를 모두 더한 결과 값은 다른 변수에 저장
→ num이 1씩 증가하다가 숫자가 10을 넘어가는 순간 while문이 끝남. 즉 num이 10일 때까지 1씩 더한 값이 sum에 저장됨
※ while문이 무한히 반복되는 경우
어떤 일을 수행할 때는 멈추면 안되고 무한 반복해야 하는 경우도 있음(ex.인터넷 쇼핑몰이 24시간 서비스 하기 위해서는
쇼핑몰이 데이터를 저장하고 있는 웹 서버가 멈추지 않고 끊임없이 돌아가야 함)
while(true) { //while문을 이렇게 사용할 경우 조건이 항상 '참'이 되어 '무한 반복'함
...
}
웹 서버처럼 끊임없이 돌아가는 시스템을 데몬(daemon)이라고 함
do-while문
do-while문 = 조건식에 맞지 않으면 반복 수행이 한 번도 일어나지 않는 while문과 달리
do-while문은 { } 안의 문장을 무조건 한 번 수행한 후에 조건식을 검사함.
즉 조건이 만족하는지 여부를 마지막에 검사하는 것임.
따라서 중괄호 안의 문장을 반드시 한 번 이상 수행해야 할 때 while문 대신 do-while문을 사용함
※ do-while문 구조
do {
수행문1;
...
} while(조건식);
수행문2;
...
for문
for문 : 반복문 중에서 가장 많이 사용하는 반복문으로 while문이나 do-while문보다 구조가 조금 더 복잡함.
그 이유는 반복문을 구현하는 데 필요한 여러 요소(변수의 초기화식, 조건식, 증감식)을 함께 작성하기 때문.
※ for문 구조
for(초기화식; 조건식; 증감식) {
수행문;
}
// 초기화식 : for문이 시작할 때 딱 한 번만 수행하며 사용할 변수를 초기화함.
// 조건식 : 언제까지 반복 수행할 것인지 구현함.
// 증감식 : 반복 횟수나 for문에서 사용하는 변수 값을 1만큼 늘리거나 줄임.
※ for문으로 1부터 5까지 출력하는 프로그램 만들기
int num;
for(num = 1; num <= 5; num++)
{
System.out.println(num);
}
num 값 | 1(초기화) | 2 | 3 | 4 | 5 | 6 |
조건식 (num <= 5) |
참 | 참 | 참 | 참 | 참 | 거짓 |
출력 값 | 1 | 2 | 3 | 4 | 5 | for문 종료 |
증감식 | 수행 | 수행 | 수행 | 수행 | 수행 | X |
※ for문을 자주 사용하는 이유
= 반복 횟수를 관리할 수 있기 때문
while문으로 작성하면 변수의 초기화와 조건 비교, 증감식을 따로 구현해야하지만,
for문으로 작성하면 초기화, 조건 비교, 증감식을 한 줄에 쓸 수 있으며 가독성도 좋음.
※ for문을 배열과 함께 자주 사용하는 이유
배열 = 같은 자료형이 순서대로 모여 있는 구조로 배열 순서를 나타내는 색인은 항상 0부터 시작함.
따라서 배열의 전체 요소 개수가 n개일 때, 요소 위치는 n-1번재로 표현할 수 있음
이러한 배열의 특성과, 증감에 따른 반복을 표현하는 데 적합한 for문의 특성 때문에
for문과 배열을 함께 자주 사용하는 것임.
※ i + 1;과 i++;의 차이점
i + 1; = i + 1이라고 쓴다고 i 값이 증가하지는 않음. 그냥 현재 i 값에 1을 더한 값을 사용하겠다는 뜻임.
ex. i = 3이었다고 하면 3에 1을 더한 4를 사용한다는 뜻임. 이 경우 i는 계속 3임. 여기서 i 값이 증가하려면
대입 연산자 까지 사용해야 함. 즉 i = i + 1; 이렇게 사용해야 i 값이 1만큼 증가하는 것임
증감 연산자를 사용한 i++는 그 뜻이 i = i + 1과 같으므로 i++만 사용해도 i 값이 증가하는 것임.
for문 요소 생략하기
for문을 구성하는 요소는 코드가 중복되거나 논리 흐름상 사용할 필요가 없을 때 생략 가능함.
① 초기화식 생략
이미 이전에 다른 곳에서 변수가 초기화되어 중복으로 초기화할 필요가 없을 때 초기화 부분 생략 가능.
int i = 0; //i가 0으로 초기화됨
for( ; i < 5; i++) { //맨 앞 초기화식 생략
...
}
② 조건식 생략
어떤 연산 결과 값이 나왔을 때 바로 for문의 수행을 멈추려면 조건식을 생략하고 for문 안에 if문을 사용하면 됨.
(ex. 1부터 시작해 수를 더해 나갈 때 더한 결과 값이 200을 넘는지 검사할 때)
for(i = 0; ; i++) { //조건식 생략
sum += i;
if(sum > 200) break;
}
③ 증감식 생략
증감식의 연산이 복잡하거나 다른 변수의 연산 결과 값에 좌우된다면 증감식을 생략하고 for문 안에 쓸 수 있음.
int(i = 0; i < 5; ) { //증감식 생략
...
i = (++i) % 10;
}
④ 요소 모두 생략
모든 요소를 생략하고 무한 반복하는 경우에 사용함.
for( ; ; ) { //무한 반복
...
}
중첩된 반복문
반복문 안에 또 다른 반복문을 중첩해서 사용하는 경우가 종종 있음(ex. 구구단)
중첩 반복문을 쓸 때는 어떤 반복문을 먼저 수행해야 하는지 그리고 내부 반복문을 수행하기 전에
초기화해야 할 값을 잘 초기화했는지를 살펴야함. for문 외의 다른 반복문도 중첩해서 사용 가능함.
※ 상황에 맞는 적절한 반복문 사용
for문 = 반복 횟수가 정해진 경우
do-while문 = 수행문을 반드시 한 번 이상 수행해야 하는 경우
while문 = 이 두 경우 외에 조건의 참과 거짓에 따라 반복문이 수행하는 경우
continue문
continue문 = 반복문과 함께 쓰임.
반복문 안에서 continue문을 만나면 이후의 문장은 수행하지 않고 for문의 처음으로 돌아가 증감식을 수행함.
즉 continue문은 반복문을 계속 수행하는데, 특정 조건에서는 수행하지 않고 건너뛰어야 할 때 사용
ex. 1부터 100까지 수를 더할 때 홀수일 때만 더하고 짝수일 때는 더하지 않는 프로그램을 continue문으로 작성
break문
break문 = switch-case문에서 break문을 사용할 때 조건을 만족하면 다른 조건을 더 이상 비교하지 않고 switch문을
빠져나왔던 것처럼 반복문에서 break문을 사용하면 그 지점에서 더 이상 수행문을 반복하지 않고 반복문을 빠져나옴.
ex. 0부터 시작해 숫자를 1씩 늘리면서 합을 계산할 때 숫자를 몇까지 더하면 100이 넘는지 알고 싶은 경우
정확한 값인 num : 14를 얻기 위해서는 증감이 이루어지기 전에 반복문을 끝내야함.(그렇지 않으면 num : 15가 됨)
그러기 위해 반복문안에 break문을 사용하려 수행을 중단하는 것임
※ break문의 위치
가끔 반복문이 중첩되는 경우가 있는데 이 경우에 break문을 사용하면 모든 반복문을 빠져나오는 것이 아니고
break문을 감싸고 있는{ } 반복문만 빠져나옴
※ continue문과 break문 비교
continue문 : 반복문을 계속 수행하지만 특정 조건에서 수행문을 생략하는 경우 사용
break문 : 반복문을 더 이상 수행하지 않고 빠져나올 때 사용
4장 연습문제 풀이
① operator 값이 +, -, *, /인 경우에 사칙 연산을 수행하는 프로그램을 if-else if문과 switch-case문을 사용해 작성
int num1 = 10;
int num2 = 2;
char operator = '+';
② 구구단을 짝수 단만 출력하도록 프로그램 작성
③ 구구단을 단보다 곱하는 수가 작거나 같은 경우까지만 출력하는 프로그램 작성
④ 반복문을 사용하여 다음 모양을 출력하는 프로그램 작성(*표시로 세모 모양 만들기)
⑤ 반복문과 조건문을 사용하여 다음 모양을 출력하는 프로그램 작성(*표시로 다이아 모양 만들기)
※ 연습문제 4, 5번 다시 풀어보기!!
객체와 객체 지향 프로그래밍
객체 = 사전의 뜻은 '의사나 행위가 미치는 대상'
(ex. 눈에 보이는 것 : 사람, 자동차, 건물 등, 눈에 보이지 않는 것 : 주문, 생산, 관리 등 모두 객체가 될 수 있음)
객체 지향 프로그래밍(OOP : Object-Oriented programming) = 객체를 기반으로 하는 프로그램으로,
어떤 대상(객체)을 가지고 프로그래밍 하는 것이라 할 수 있음
생활 속에서 객체 찾아보기
① 절차 지향 프로그래밍 = 순서대로 일어나는 일을 시간순으로 프로그래밍 하는 것
ex. 아침에 일어나서 학교까지 가는 과정
아침에 일어난다 → 씻는다 → 밥을 먹는다 → 버스를 탄다 → 요금을 지불한다 → 학교에 도착한다
② 객체 지향 프로그래밍 = 객체를 정의하고 객체 간 협력을 프로그래밍 하는 것
ex. 아침에 일어나서 학교까지 가는 과정에서 대상이 되는 객체 = 학생, 밥, 버스, 학교 등
'밥을 먹는다'는 행동은 '학생'이라는 객체와 '밥'이라는 객체가 있어 학생이 밥을 먹는 협력으로 이루어짐
→ 객체 지향 프로그램은 먼저 객체를 만들고 객체 사이에 일어나는 일을 구현하는 것임.
클래스
클래스 = 객체 지향 프로그래밍은 클래스를 기반으로 프로그래밍하며,
클래스는 객체의 속성과 기능을 코드로 구현한 것임.
객체를 클래스로 구현하는 것을 '클래스를 정의한다'라고 함.
클래스를 정의하려면 우선 클래스 이름과 클래스가 가지는 속성 또는 특성이 필요함
ex. 학생 객체를 생각해보면, 먼저 객체를 표현할 클래스의 '이름'이 필요함.
이 이름을 Student라고 하고 학생 객체가 가지는 일반적인 속성을 생각해보면 학번, 이름, 학년, 사는 곳 등이 있음.
이런 클래스 속성은 특성이라고도 하고 클래스 내부에 변수로 선언하는데,
이렇게 선언하는 클래스의 속성을 '멤버 변수'라고 함
※ 클래스를 정의하는 문법
(접근 제어자) class 클래스 이름 {
멤버 변수;
메서드;
}
※ 클래스 이름 짓는 규칙
자바에서 클래스 이름은 대문자로 시작함. 소문자로 시작한다고 해서 오류가 발생하는 것은 아니지만, =
대문자로 시작하는 것이 개발자들 사이의 규칙임. 이러한 코딩 규칙을 코딩 동네에서는 코딩 컨벤션이라고 함.
코딩 컨벤션이란 코딩을 할 때 읽기 쉽고 이해하기 쉽도록 정한 규칙으로
'클래스 이름은 대문자로 시작한다'는 것도 그중 하나라고 볼 수 있음
클래스 속성을 구현하는 멤버 변수
Student 클래스를 다시 살펴보면 학생 객체가 가지는 속성(학번, 이름, 학년 등)을 변수로 선언함.
이렇게 클래스 내부에 선언하여 객체 속성을 나타내는 변수가 멤버 변수임
클래스에 선언하는 멤버 변수는 다른말로 속성, 특성 등으로 표현하기도함(멤버 변수 = 속성 = 특성)
멤버 변수는 속성이 무엇이냐에 따라 알맞은 자료형을 선언해 주어야 함.(ex. 정수 : int, 문자열 : String)
속성 | 자료형 | 변수 이름 | 설명 |
학번 | int | studentID | 학번은 정수로 나타낼 수 있기 때문에 int형으로 선언함 |
이름 | String | studentName | 학생 이름은 문자로 되어 있음. 그런데 이름은 A 같은 하나의 문자가 아니라 여러 개의 문자로 이루어진 문자열로 표현함. 문자열은 자바에서 제공하는 String 클래스를 사용합니다. |
학년 | int | grade | 학년은 정수로 나타낼 수 있기 때문에 int형으로 선언함 |
사는 곳 | String | address | 문자열을 나타내기 위해 String을 사용함 |
ex. 사람 객체를 구현하는 Person 클래스 만들기
사람 속성 = 이름, 나이, 직업, 주소, 키, 몸무게 등
코드에서 패키지 생성까지는 그대로 두고 클래스 파일만 추가함.
멤버 변수를 선언할 때 int형, double형 같은 기본 자료형으로 선언할 수도 있고, 또 다른 클래스형으로 선언할 수도 있음.
클래스형이란 다른 말로 객체 자료형 또는 참조 자료형이라고 하며,
참조 자료형으로 사용하는 클래스는 String, Date와 같은 이미 JDK에서 제공하는 것일 수도 있고,
개발자가 직접 만든 Student나 Person 같은 클래스가 다른 클래스에서 사용하는 멤버 변수의 자료형이 될 수도 있음.
클래스 기능을 구현하는 메서드
멤버 함수 또는 메서드 = 클래스 내부에서 멤버 변수를 사용하여 클래스 기능을 구현한 것
클래스에서는 학생 객체가 가지는 속성을 사용해 학생과 관련된 기능을 구현할 수 있음
(ex. '학생에게 이름을 부여한다', '학생이 사는 곳을 출력한다')
ex. 학생 이름과 주소 출력하는 메서드 만들기
위 코드를 보면 Student 클래스 안에 showStudentInfo( ) 메서드를 추가했는데,
이 메서드는 학생 이름과 주소를 출력하는 기능임
패키지
패키지 = 클래스 파일의 묶음이라고 할 수 있으며, 패키지를 만들면 프로젝트 하위에 물리적으로 디렉터리가 생성됨.
또한 패키지는 계층 구조를 가질 수 있고, 프로젝트를 수행할 때 패키지의 계층 구조를 구성하는 것은
전체 프로젝트의 소스 코드를 어떻게 관리할지와 관련이 있음.
ex. 학교와 관련된 프로젝트를 수행한다고 할 때 이 프로젝트는 학생, 과목, 교실, 담당 교수, 학과 등의 클래스로
만들 수 있으며 그러한 클래스와 협력을 하는 여러 다른 클래스가 있을 수 있음
(학생이 신청한 과목 정보를 담고 있는 클래스, 학생 정보를 다져오는 클래스 등)
패키지의 계층 구조를 만드는 작업은 이러한 소스 코드를 어떠한 계층 구조로 관리할지 구성하는 것임
패키지가 단순히 클래스 묶음이 아닌 프로젝트 전체 소스 코드를 구성하는 계층 구조가 되고,
이 계층 구조를 잘 구성해야 소스 코드 관리와 유지 보수가 편리하다는 사실을 알아둬야함.
※ 패키지 선언하기
자바 소스 코드에서 클래스의 패키지 선언은 맨 위에서 함.
클래스 이름은 StudentView이지만, 클래스의 전체 이름은 domain.student.view.StudentView임.
클래스 이름이 같다고 해도 패키지 이름이 다르면 클래스 전체 이름이 다른 것이므로 다른 클래스가 됨.
다시 말해 같은 이름의 클래스라도 다른 패키지에 속해 있으면 서로 연관이 없음
'코딩 국비 학원 > Do it! 자바 프로그래밍 입문' 카테고리의 다른 글
[Do it! 자바 프로그래밍 입문]생성자, 참조 자료형, 정보 은닉 (0) | 2022.12.05 |
---|---|
[Do it! 자바 프로그래밍 입문]함수, 메서드, 클래스와 인스턴스 (0) | 2022.12.04 |
[Do it! 자바 프로그래밍 입문]비트 연산자, 조건문 (0) | 2022.12.02 |
[Do it! 자바 프로그래밍 입문]상수, 리터럴, 형 변환, 기본 연산자 (0) | 2022.12.01 |
[Do it! 자바 프로그래밍 입문]기본 자료형 (0) | 2022.11.30 |