중첩 조건문
중첩 조건문은 조건문 안에 조건문이 있는 경우를 의미합니다. 즉, if-else문 안에 if-else문이 들어 있는 형태입니다.

import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("학년을 입력하세요.");
Scanner scanGrade = new Scanner(System.in);
int grade = scanGrade.nextInt();
if (grade == 4) {
System.out.println("점수를 입력하세요.");
Scanner scanScore = new Scanner(System.in);
int score = scanScore.nextInt();
if (score >= 90) {
System.out.println("장학금 지급 대상입니다.");
} else {
System.out.println("장학금 지급 대상이 아닙니다.");
}
} else {
System.out.println("장학금 지급 학년이 아닙니다.");
}
}
}
즉, 위 코드에서는 첫 번째 if-else문의 조건이 만족될 때 두 번째 if-else문이 실행됩니다.
조건과 일치하는 값 찾기: switch
switch문도 if-else문처럼 조건에 따라 실행할 명령이 달라집니다.
switch (조건) {
case (값1):
실행문;
break;
case (값2):
실행문;
break;
...
default: // 생략 가능
실행문;
break;
}
- 중괄호 안에는 조건과 비교할 값을 가진 여러 case 블록이 있습니다. case 블록의 수는 비교할 값의 개수에 따라서 달라집니다.
- break는 해당 case 블록이 조건을 만족할 때 switch문을 탈출하게 하는 역할을 합니다.
switch문을 실행하면 조건과 case 블록의 값을 순서대로 비교합니다.
만약 값이 일치하는 case 블록이 없다면 default 블록으로 가서 명령문을 실행합니다. default 블록은 switch문 어디든 작성해도 됩니다. 그러나 코드 흐름을 파악하기 쉽게 마지막에 작성하는 것을 권장드립니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
System.out.println("점수를 입력하세요.");
Scanner scan = new Scanner(System.in);
int score = scan.nextInt();
switch (score) {
case (90):
System.out.println("A학점입니다.");
break;
case (80):
System.out.println("B학점입니다.");
break;
case(70):
System.out.println("C학점입니다.");
break;
case(60):
System.out.println("D학점입니다.");
break;
}
}
}
만일 case 블록에 break를 넣지 않으면 switch문을 종료하지 않고, 다음 case 블록도 계속 실행하므로 주의해야 합니다.
삼항 연산자
삼항 연산자를 사용하면 if-else문의 조건 부분을 한 줄로 작성할 수 있습니다. 즉, 조건문의 코드 줄 수를 줄이는 역할을 합니다.
앞에는 true 또는 false 값을 반환하는 조건이 들어갑니다. 조건의 결과가 true이면 A를 선택하고 false이면 B를 선택합니다.
(조건) ? A : B
범위 안에서 반복할 때 : for문
for문은 대표적인 반복문의 형태로 정해진 횟수나 범위만큼 반복할 때 사용합니다. 반복문은 코드 중복을 줄이고 효율성을 높이는 역할을 합니다.
for (초깃값; 조건식; 증감식) {
실행문; // 반복 실행할 명령문
}
- 초깃값 : 반복문의 시작점, 즉 반복 범위의 시작 값입니다. 이는 반복문을 처음 실행할 때 한 번 수행합니다. 일반적으로 변수명은 i를 사용하고, 반복문의 수가 늘어나면 j, k로 확장해 갑니다. 변수의 초깃값은 보통 0으로 설정합니다.
- 조건식 : 반복문을 실행할 조건을 넣습니다. 반복할 횟수나 범위를 나타냅니다.
- 실행문 : 반복문에서 실제로 반복되는 부분입니다.
- 증감식 : 변수 값을 증가시키거나 감소시켜서 반복 횟수나 범위를 조절합니다.
아래는 1부터 10까지 출력하는 코드를 for문의 형식에 맞춰서 작성한 코드입니다.
public class Main {
public static void main(String[] args) {
for (int i = 0; i < 10; i++) {
System.out.println(i + 1);
}
}
}
증감 연산자
증감 연산자가 변수 앞에 있을 때는 전위 연산자, 변수 뒤에 오면 후위 연산자라고 합니다.
증감 연산자 | 설명 |
i++ | i 값을 사용한 후에 i + 1 수행 |
i-- | i 값을 사용한 후에 i - 1 수행 |
++i | i + 1 을 한 후에 i 값 사용 |
--i | i - 1 을 한 후에 i 값 사용 |
public class Main {
public static void main(String[] args) {
int num1 = 5;
int num2 = 5;
int result1 = num1++;
int result2 = ++num2;
System.out.println(result1); // 5
System.out.println(result2); // 6
System.out.println(num1); // 6
System.out.println(num2); // 6
}
}
for문으로 연산_1
아래 코드는 1부터 100까지의 합을 구하는 코드입니다.
public class Main {
public static void main(String[] args) {
int sum = 0;
for (int i = 1; i <= 100; i++) {
sum = sum + i;
}
System.out.println(sum);
}
}
이는 sum에 i를 더하고 이를 다시 sum에 저장합니다. 또한, sum을 변수로 사용하기 전에 강제로 초기화를 해야 합니다.
for문으로 연산_2
for문으로 구구단 프로그램을 만듭니다.
아래 코드는 구구단 3단을 출력하는 코드입니다.
public class Main {
public static void main(String[] args) {
int value;
for (int i = 1; i <= 9; i ++) {
value = 3 * i;
System.out.println("3 x " + i + " = " + value);
}
}
}
만일 구구단의 단을 입력하고자 한다면 아래 코드로 작성하면 됩니다.
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int value;
Scanner scan = new Scanner(System.in);
System.out.println("몇 단을 출력할까요?"); // 단(정수) 입력받기
int dan = scan.nextInt();
for (int i = 1; i <= 9; i ++) {
value = dan * i;
System.out.println(dan + " x " + i + " = " + value);
}
}
}
중첩 반복문
중첩 반복문은 반복문 안에 반복문이 있는 것을 의미합니다.
구구단 전체를 출력해봅시다.
우선 아래 코드는 구구단의 단을 for문을 통해 반복합니다.
public class Main {
public static void main(String[] args) {
for (int i = 2; i <= 9; i++) {
// 수행할 명령문
}
}
}
아래 코드는 구구단 전체를 출력해줍니다.
public class Main {
public static void main(String[] args) {
for (int i = 2; i <= 9; i++) { // 2단부터 9단까지 반복
int value;
System.out.println("--- " + i + "단 ---");
for (int j = 1; j <= 9; j++) {
value = i * j;
System.out.println(i + " x " + j + " = " + value);
}
}
}
}
조건이 참일 동안 반복할 때 : while문
while 문은 조건식이 참인 동안 while 문 안 명령문을 반복해서 실행합니다.
while (조건식) {
실행문; // 반복 실행할 명령문
}
1부터 10까지 출력하는 코드를 for문으로 작성했을 때와 while문으로 작성했을 때를 비교해봅시다.
// for문
for (int i = 0; i < 10; i++) {
System.out.println(i + 1)
}
// while문
int i = 0;
while (i < 10) {
System.out.println(i + 1);
i++;
}
while문을 이용해서 3단을 출력해봅시다.
int value;
int i = 1;
while (i <= 9) {
value = 3 * i;
System.out.println("3 x " + i + " = " + value);
i++;
}

무조건 한 번은 실행할 때 : do-while문
do-while 문은 조건식과 상관없이 무조건 한 번은 명령문을 실행한 후, 조건이 참일 동안 반복합니다. 조건이 참이 아니면 반복문을 빠져나갑니다.
do {
실행문;
} while (조건식);
do-while문을 이용해서 3단을 출력해봅시다.
int value;
int i = 1;
do {
value = 3 * i;
System.out.println("3 x " + i + " = " + value);
i++;
} while (i <= 9);
do-while 반복문은 어떤 명령을 한 번 수행한 후 반복 여부를 결정할 때 주로 사용합니다.
// while문 사용
public class Main {
public static void main(String[] args) {
int i = 1;
while (i < 1) {
System.out.println("while 문 " + i + "번째 실행");
i++;
}
System.out.println("현재 i 변수의 값 : " + i);
}
}
// do-while문 사용
public class Main {
public static void main(String[] args) {
int i = 1;
do {
System.out.println("do-while 문 " + i + "번째 실행");
i++;
} while (i < 1);
System.out.println("현재 i 변수의 값 : " + i);
}
}

무한 반복문
반복문이 끝나지 않고 무한히 반복되면 이를 무한 반복문 또는 무한 루프라고 합니다. 프로그램에서 의도적으로 무한 반복문을 작성하기도 합니다.
- 제작 방법
- for문 : 소괄호 안에 세미콜론만 남깁니다.
for(;;) { - while문 : 조건식에 true만 넣습니다.
while(true) {
- for문 : 소괄호 안에 세미콜론만 남깁니다.
무한 반복문을 잘못 만들면 프로그램이 종료되지 않고 영원히 실행될 수 있습니다. 그러면 CPU나 메모리 등이 계속 낭비되어 컴퓨터에 문제가 생길 수 있습니다.
프로그램의 흐름 제어
break문
- 반복문에서 break문을 만나면 반복문을 탈출합니다. 프로그램을 종료하는 것이 아니라 반복문을 중단하고 다음 코드로 넘어갑니다. 무한 반복에서 빠져나올 때 주로 break문을 사용합니다.
while (true) {
실행문;
break;
}
continue문
- 반복문에서 continue문을 만나면 현재 반복을 중단하고 다음 반복으로 넘어갑니다. 반복문을 중단하는 것이 아니라 현재 반복을 건너뛰는 역할을 합니다.
배열
변수는 어떤 자료형의 값을 저장하기 위한 공간입니다. 배열은 이런 변수가 여러 개 연속해 있습니다.
즉, 배열(array)은 같은 자료형의 값 여러 개를 변수 하나로 묶어 관리하는 것입니다. 배열은 같은 유형의 데이터를 효율적으로 관리하기 위해 필요합니다.
아래 코드는 학생 4명의 점수를 출력한 것입니다.
public class Main {
public static void main(String[] args) {
int score1 = 80;
int score2 = 100;
int score3 = 90;
int score4 = 60;
System.out.println("1번 학생의 점수 : " + score1);
System.out.println("2번 학생의 점수 : " + score2);
System.out.println("3번 학생의 점수 : " + score3);
System.out.println("4번 학생의 점수 : " + score4);
}
}
배열 선언하고 초기화
배열을 사용하려면 먼저 선언해야 합니다.
1. 자료형[] 배열명;
2. 자료형 배열명[];
주로 첫번째 코드와 같은 형식을 이용합니다.
선언만 해서는 배열을 사용할 수 없고 초기화해야 합니다.
선언과 동시에 값을 넣어 초기화하는 방법
- 초기값의 개수에 따라 배열 크기가 자동으로 결정됩니다.
- 배열에 담긴 값의 자료형은 모두 같아야 합니다. 만일 String으로 배열을 선언한다면 값은 모두 문자열이여야 합니다.
자료형[] 배열명 = {값1, 값2, ...};
int[] scoreArray = {80, 100, 90, 60};
크기를 지정해 배열을 생성하는 방법
- new라는 키워드를 사용합니다.
- 배열 크기는 배열에 저장할 수 있는 값의 최대 개수를 나타냅니다.
- 크기를 지정해 배열을 선언하면 자료형의 기본값으로 초기화됩니다.
자료형[] 배열명 = new 자료형[배열_크기];
int[] scoreArray = new int[4];
요소는 배열에 저장된 값입니다. 배열에서 요소의 위치를 나타내기 위해서 인덱스(index)를 사용합니다.
배열명[인덱스]
인덱스는 항상 0부터 시작하고 배열의 마지막 인덱스는 배열의 크기 - 1입니다.
public class Main {
public static void main(String[] args) {
int[] scoreArray = {80, 100, 90, 60};
System.out.println("1번 학생의 점수 : " + scoreArray[0]);
System.out.println("2번 학생의 점수 : " + scoreArray[1]);
System.out.println("3번 학생의 점수 : " + scoreArray[2]);
System.out.println("4번 학생의 점수 : " + scoreArray[3]);
}
}
아래는 인덱스로 해당 위치를 접근하여 새로운 값을 저장하는 코드입니다.
배열명[인덱스] = 새로운_값;
public class Main {
public static void main(String[] args) {
int[] scoreArray = {80, 100, 90, 60};
scoreArray[0] = 50;
scoreArray[1] = 70;
scoreArray[2] = 40;
scoreArray[3] = 20;
System.out.println("1번 학생의 점수 : " + scoreArray[0]);
System.out.println("2번 학생의 점수 : " + scoreArray[1]);
System.out.println("3번 학생의 점수 : " + scoreArray[2]);
System.out.println("4번 학생의 점수 : " + scoreArray[3]);
}
}
이차원 배열
이차원 배열은 일차원 배열이 여러 개 모일 경우 생성됩니다. 이차원 배열은 행(row)과 열(column)으로 구성됩니다.

이차원 배열 선언 & 초기화
이차원 배열을 선언하고 초기화하는 방법은 2가지입니다.
1. 배열을 선언할 때 직접 값을 넣어 초기화하는 방법
이차원 배열을 선언하고 일차원 배열을 값으로 넣어 초기화합니다.
자료형[][] 배열명 = { {값1, 값2, ...}, {값1, 값2, ...}, ... };
int[][] arr2 = { {0, 1, 2}, {3, 4, 5}, {6, 7, 8} };
2. 배열 크기로 생성하는 방법
new 키워드를 사용하고 자료형 뒤에 행과 열의 크기를 각각 명시합니다. 행은 가로, 열은 세로라고 표현합니다.
자료형[][] 배열명 = new 자료형[행_크기][열_크기];
아래 코드는 행 크기, 열 크기가 각각 3인 이차원 배열입니다.
int[][] arr2 = new int[3][3];
이차원 배열에 접근
이차원 배열의 요소에 접근할 때도 인덱스를 사용합니다. 이차원 배열은 인덱스가 2개이기 때문에 for문도 2개로 중첩 반복문을 사용해야 합니다.
배열명[행_인덱스][열_인덱스];
public class Main {
public static void main(String[] args) {
int[][] matrix = new int[3][3];
matrix[0][0] = 1;
matrix[0][1] = 2;
matrix[0][2] = 3;
matrix[1][0] = 4;
matrix[1][1] = 5;
matrix[1][2] = 6;
matrix[2][0] = 7;
matrix[2][1] = 8;
matrix[2][2] = 9;
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
System.out.print(matrix[i][j] + " "); // 값 구분을 위해 공백 추가
}
System.out.println(""); // 행 구분을 위해 줄 바꿈 추가
}
}
}
- matrix.length : matrix 배열에서 행의 수
- matrix[0].length : matrix 배열에서 첫 번째 행의 열 개수
위 코드를 length 속성을 통해 수정할 수 있습니다.
public class Main {
public static void main(String[] args) {
int[][] matrix = new int[3][3];
int x = 1;
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
matrix[i][j] = x;
x++; // 초깃값이 0일 때는 ++x로 작성
}
}
for (int i = 0; i < matrix.length; i++) {
for (int j = 0; j < matrix[0].length; j++) {
System.out.print(matrix[i][j] + " ");
}
System.out.println("");
}
}
}
이차원 배열로 구구단 프로그램 만들기
public class Main {
public static void main(String[] args) {
int[][] gugudan = new int[9][9]; // 이차원 배열 생성
for (int i = 0; i <= 8; i++) { // 단
System.out.println("--- " + (i + 1) + "단 ---");
for (int j = 0; j <= 8; j++) { // 곱하는 수
gugudan[i][j] = (i + 1) * (j + 1); // 배열에 곱한 값 저장
System.out.println((i + 1) + " * " + (j + 1) + " = " + gugudan[i][j]);
}
}
}
}
다차원 배열은 이차원 배열 이상의 배열을 의미합니다. 이는 실무에서는 거의 사용되지 않기 때문에 이차원 배열까지만 알아도 충분합니다.
참조 자료형으로서의 배열
참조 자료형은 실제 값이 아닌 메모리 주소를 저장하는 변수의 자료형입니다.
참조는 실제 값이 아닌 주소를 저장하는 것을 의미합니다. 즉, 메모리 주소를 저장하는 변수를 참조 변수(reference variable)이라고 합니다.

자바 프로그램이 실행되며 메모리를 할당받는데 이를 런타임 데이터 영역이라고 합니다.

- 일반 변수는 스택에 값을 저장합니다. int a = 10; 을 보면 스택에 할당된 영역을 a 변수가 가리키고 여기에 10이 저장되며 초기화합니다.
- 참조 변수는 스택에 할당되고 실제 값은 힙에 저장됩니다. 변수에는 값이 저장된 힙의 주소가 저장됩니다. 참조 변수는 저장된 주소를 통해 힙의 값에 접근할 수 있습니다.
- int[] numbers = new int[5]; 를 보면 new 키워드가 중요한 역할을 합니다. new 키워드는 힙에 새로운 공간을 할당하고 할당된 공간에 배열을 생성합니다. new 키워드는 힙에 생성된 배열의 첫 번째 요소의 주소를 반환합니다. 반환된 주소는 스택 영역에 있는 numbers 변수에 저장됩니다.
배열의 복사
일반 변수는 변수의 값을 다른 변수에 복사할 수 있습니다. 이는 값 자체를 복사하기 때문입니다.
int a = 1;
int b = a; // b의 값은 1
참조 변수 - 얕은 복사, 깊은 복
- 변수가 저장하고 있는 값은 배열 첫 번째 요소의 주소입니다. 실제 값이 아닌 배열의 주소를 참조합니다. 복사한 변수 또한 배열 첫 번째 요소의 주소를 저장합니다.
- 얕은 복사
- 얕은 복사는 배열을 복사했을 때 동일한 배열을 가리키는 것으로 배열의 참조 즉, 주소만 복사합니다.
- 이는 한 쪽에서 값을 변경했을 때 다른 쪽에도 영향을 미칩니다.
int[] originArray = {1, 2, 3};
int[] copyArray = originArray;
System.out.println(copyArray[0]); // 1
System.out.println(copyArray[1]); // 2
System.out.println(copyArray[2]); // 3
copyArray[0] = 10; // 첫 번째 요소가 10으로 변경
System.out.println(originArray[0]); // 10이 출력됨
- 깊은 복사
- 깊은 복사는 원본 배열과 독립적인 복사본이 필요할 때 사용하는 것으로 배열의 모든 요소를 복사해 새로운 배열을 생성하는 것입니다.
- 깊은 복사된 배열은 원본 배열과 별개의 메모리 공간에 존재하며, 한 쪽을 수정해도 다른 쪽에 영향을 미치지 않습니다.
- 깊은 복사를 하는 방법은 모든 요소를 하나하나 복사하는 방식입니다.
public class Main {
public static void main(String[] args) {
int[] originArray = {1, 2, 3};
int[] deepCopyArray = new int[originArray.length];
for (int i = 0; i < originArray.length; i++) {
deepCopyArray[i] = originArray[i];
}
deepCopyArray[0] = 10;
System.out.println(originArray[0]); // 1이 출력
}
}
객체지향 프로그래밍
자바는 객체지향 프로그래밍 언어입니다. 객체지향 프로그래밍은 프로그래밍 패러다임의 하나입니다. 프로그래밍 패러다임은 프로그램을 설계하는 관점을 의미합니다. 같은 프로그램을 만들더라도 패러다임에 따라서 만드는 방식과 접근 방법이 달라집니다.
명령형 프로그래밍
- 초기에는 프로그램의 상태와 제어 흐름을 조작하는 명령어를 순차적으로 실행하는 방식으로 프로그램을 설계하였습니다.
- 이 패러다임에서는 프로그램이 어떻게 동작하는지 제어하는데 초점이 맞추어져 있습니다. 순차적 처리가 중요하며 명령어로 프로그램의 상태를 변경하고 제어문으로 명령어의 순서를 제어합니다.
객체지향 프로그래밍
- 데이터와 데이터를 조작하는 동작을 객체라는 단위로 묶어 프로그램을 구성하는 방식입니다.
- 객체 간에 서로 메시지를 전달해 상호작용하며 흐름을 제어합니다.
- 이를 이용하면 반복 코드가 줄어 재사용성이 높아지고 간결해집니다. 또한, 프로그램이 유연하고 확장하기 쉬우며 유지 보수하기가 쉽습니다.
- 특징 : 캡슐화, 상속, 다형성, 추상화
캡슐화(encapsulation)
- 데이터와 동작 등 프로그램에 필요한 모든 자원을 객체로 묶어 감추는 것을 의미합니다.
- 객체의 데이터를 보호하고 외부에서 잘못된 접근을 못하게 막을 수 있습니다.
상속(inheritance)
- 한 클래스의 데이터와 기능을 다른 클래스가 이어받는 것을 의미합니다.
다형성(polymorphism)
- 동작이나 형태가 다른 기능을 하나의 이름으로 사용할 수 있게 하는 것을 의미합니다.
- 자바에서는 오버라이딩과 오버로딩 등을 통해 다형성을 지원합니다.
추상화(abstraction)
- 객체마다 데이터와 동작을 구체적으로 정의하지 않고 객체들의 공통적인 데이터와 동작만 추출해 선언해두는 것을 의미합니다.
클래스와 객체
클래스와 객체에 대해 헷갈릴 수 있습니다. 예시로 생각해보면 클래스는 설계도이고 객체는 설계도로 구현한 자동차를 의미합니다. 즉, 클래스를 기반으로 객체를 여러 개 생성할 수 있습니다.
클래스 선언
패키지는 클래스를 그룹화한 단위로 일종의 폴더입니다.
패키지명은 모두 소문자로 작성합니다. 숫자로 시작할 수 없고, _와 $ 외에 특수문자는 사용할 수 없습니다. 키워드도 사용할 수 없습니다.
package ch07;
public class Car {
}
- package는 패키지를 나타내는 키워드이고 뒤에 패키지명이 옵니다.
- public은 접근 제한자 또는 접근 제어자라고 합니다. 이는 클래스에 접근할 수 있는 범위나 권한을 나타냅니다.
- public이 붙은 클래스는 같은 패키지에 있는 클래스부터 다른 패키지에 있는 클래스까지 어디에서나 접근할 수 있습니다. 만약 아무것도 붙이지 않으면 같은 패키지에 있는 클래스에만 접근할 수 있습니다.
- 클래스명은 첫 글자를 대문자로 작성합니다. 또한, 클래스명은 자바 파일명과 같습니다.
[접근_제한자] class 클래스명 {
// 클래스 본문
}
클래스 멤버
클래스 멤버에는 필드, 생성자, 메서드라는 구성 요소가 있습니다.
필드(field)
- 필드는 클래스에 선언하는 변수를 의미하며 멤버 변수라고도 합니다.
- 필드는 객체의 데이터에 해당하는 상태나 속성을 저장할 때 사용합니다. 필드에도 접근 제한자를 사용할 수 있습니다.
- 필드에 있는 3가지 변수 - 인스턴스 변수, 클래스 변수, 지역 변수
- 인스턴스 변수 : 클래스가 객체를 생성할 때마다 새로 생성되는 변수입니다. 객체마다 각각 고유한 값이 저장됩니다.
- 클래스 변수 : 모든 객체에서 공유하는 변수입니다. 선언할 때는 앞에 static 키워드를 붙입니다. 클래스에서 한 번만 초기화하고 모든 객체에서 같은 값을 사용합니다. 공통으로 사용할 데이터는 클래스 변수에 주로 저장합니다.
- 지역 변수 : 메서드가 실행될 동안만 지역 변수에 저장된 값이 유효합니다.
package ch07;
public class Car {
// 클래스 변수
static int countOfCars = 0; // 자동차 수량
// 인스턴스 변수
String brand; // 브랜드
int year; // 연식
String color; // 색
}
메서드
프로그래밍 중 특정 작업을 여러 번 수행해야 할 때 해당 작업을 수행하는 코드를 어딘가에 정의한 후 가져와서 사용하면 코드를 중복해서 사용하지 않아도 되고 여러 곳에서 쉽게 사용할 수 있습니다.
이를 함수(function)이라고 합니다. 자바에서는 클래스 안에 정의한 함수를 메서드라고 합니다. 또한, 자바는 함수를 모두 메서드라고 칭합니다. 메서드는 객체가 수행하는 동작이나 기능을 의미합니다.

[접근_제한자] 반환형 메서드명(매개변수1, 매개변수2, ...) }
// 메서드 본문
}
메서드도 접근 제한자를 사용해 접근 범위를 제한할 수 있습니다. 아무것도 명시하지 않으면 같은 패키지 안에서만 접근할 수 있습니다.
반환형
- 메서드를 실행한 뒤 결과로 어떤 자료형의 값을 반환할지 선언합니다.
- 반환형은 생략할 수 없으며, 결과를 돌려줄 필요가 없는 경우 void 키워드로 선언합니다. 즉, void로 선언할 때를 제외하고는 항상 결과를 반환해야 합니다.
- return 키워드로 돌려줄 값을 표시하는데 이 값을 반환값이라고 합니다.
메서드명
- 메서드명은 메서드가 어떤 동작을 하는지 드러나도록 짓는 것이 좋습니다. 또한, 메서드명은 카멜 표기법으로 작성합니다.
매개변수(parameter)
- 메서드가 외부에서 전달받는 값을 저장하는 변수입니다.
- 매개변수의 자료형은 전달받은 값의 자료형과 같아야 합니다.
- 매개변수가 없으면 빈 괄호만 표시합니다. 또한, 매개변수는 지역변수입니다.
- 반환형과 배개변수를 합쳐서 메서드 시그니처라고 합니다.
인스턴스 메서드 : 인스턴스 변수에 접근할 수 있는 메서드
클래스 메서드 : 클래스 변수에 접근할 수 있는 메서드
클래스 매서드는 인스턴스 변수나 인스턴스 메서드에 접근할 수 없고 static 키워드를 넣어 선언합니다. 이는 정적 메서드라고 합니다.
package ch07;
public class Car {
// 클래스 변수
static int countOfCars = 0; // 자동차 수량
// 인스턴스 변수
String brand; // 브랜드
int year; // 연식
String color; // 색
// 인스턴스 메서드
public void carInfo() {
System.out.println("--- 자동차 정보 ---");
System.out.println("브랜드:" + brand);
System.out.println("연식:" + year);
System.out.println("색:" + color);
}
// 클래스 메서드
public static void countOfCarsInfo() {
System.out.println("자동차 수량:" + countOfCars);
}
}
인자(argument)는 매개변수가 있는 메서드를 호출할 때 매개변수에 전달하는 값입니다. 매개변수가 없는 변수를 호출할 때는 인자가 필요 없습니다.
생성자
생성자(constructor)는 객체를 생성하고 초기화하는 특별한 메서드입니다. 객체가 생성될 때 자동으로 실행되며 생성된 객체의 초깃값을 설정하는 데 사용합니다.
- 생성자는 클래스와 이름이 같고, 반환형을 명시하지 않습니다. 반환형을 명시하면 일반 메서드가 됩니다.
클래스에 생성자를 정의하지 않으면 컴파일러가 자동으로 생성자를 추가합니다. 이러한 생성자는 매개변수가 없습니다. 이처럼 매개변수가 없는 생성자를 기본 생성자라고 합니다.
package ch07;
public class Car {
// 클래스 변수
static int countOfCars = 0; // 자동차 수량
// 인스턴스 변수
String brand; // 브랜드
int year; // 연식
String color; // 색
// 기본 생성자
public Car() {
System.out.println("새로운 자동차 객체가 생성됐습니다.");
}
// 인스턴스 메서드
public void carInfo() {
System.out.println("--- 자동차 정보 ---");
System.out.println("브랜드:" + brand);
System.out.println("연식:" + year);
System.out.println("색:" + color);
}
// 클래스 메서드
public static void countOfCarsInfo() {
System.out.println("자동차 수량:" + countOfCars);
}
}
한 클래스 안에서 기본 생성자 외에 생성자 여러 개를 정의할 수 있습니다. 단, 각 생성자의 매개변수가 달라야 구분할 수 있습니다. 매개변수가 있는 생성자를 사용하면 객체의 초깃값을 원하는 대로 설정할 수 있습니다.
package ch07;
public class Car {
// 클래스 변수
static int countOfCars = 0; // 자동차 수량
// 인스턴스 변수
String brand; // 브랜드
int year; // 연식
String color; // 색
// 기본 생성자
public Car() {
System.out.println("새로운 자동차 객체가 생성됐습니다.");
this.carInfo(); // 인스턴스 메서드 호출
}
// 매개변수가 2개 있는 생성자
public Car(String brand, int year) {
System.out.println("새로운 자동차 객체가 생성되었습니다.");
this.brand = brand;
this.year = year;
this.color = "white";
this.carInfo();
}
// 매개변수가 3개 있는 생성자
public Car(String brand, int year, String color) {
System.out.println("새로운 자동차 객체가 생성되었습니다.");
this.brand = brand;
this.year = year;
this.color = color;
}
// 인스턴스 메서드
public void carInfo() {
System.out.println("--- 자동차 정보 ---");
System.out.println("브랜드:" + brand);
System.out.println("연식:" + year);
System.out.println("색:" + color);
}
// 클래스 메서드
public static void countOfCarsInfo() {
System.out.println("자동차 수량:" + countOfCars);
}
}
생성자에 this 라는 키워드가 있습니다. 이는 객체 자신 즉, 생성자를 호출해서 생성한 객체를 가리키는 특별한 변수입니다.
this는 다음과 같은 경우에 사용합니다.
- this는 객체에서 인스턴스 변수와 매개변수의 이름이 같을 때 둘을 구분하는 데 사용합니다.
- this는 객체의 메서드를 호출할 때 사용합니다. 점 연산자(.)는 멤버 참조 연산자로 객체의 변수나 메서드에 접근할 때 사용합니다.
객체 생성
객체를 생성할 때도 new 키워드를 사용합니다. new 키워드 뒤에는 객체를 생성할 클래스명이 옵니다. 해당 클래스에 정의한 생성자를 호출하며 객체를 생성합니다.
new 클래스명();
new Car();
객체를 생성하면 메모리가 어딘가에 저장되지만 객체가 어디에 생성되었는지는 알 수 없습니다. 객체를 만든 후 실제로 사용하려면 객체가 저장된 위치를 알아야 합니다. 그리하여 변수가 필요합니다.
변수를 선언하고 생성한 객체의 위치를 변수에 저장하면 객체에 접근할 수 있습니다. 객체를 받는 변수의 자료형은 객체를 생성한 클래스가 됩니다.
클래스명 변수명 = new 클래스명();
변수에 저장되는 것은 메모리 주소입니다. 즉, 객체도 참조 변수를 사용함을 알 수 있습니다.
Car myCar = new Car();

문자열 상수 풀(string constant pool)은 문자열 리터럴이 저장되는 곳으로 힙에 있는 특수한 영역입니다.
new 키워드를 사용하면 문자열 상수 풀에서 값을 찾는 것이 아니라 힙에 새로운 객체가 생성됩니다.
만일 두 문자열의 내용, 즉 값이 같은지 비교하고 싶다면 equals() 메서드를 사용합니다.
String형의 기본값은 null이고 int형의 기본값은 0입니다.
'Study > 코딩 자율학습단' 카테고리의 다른 글
[코딩 자율학습단 13기] 자바 입문 [4주차] (0) | 2025.03.19 |
---|---|
[코딩 자율학습단 13기] 자바 입문 [3주차] (0) | 2025.03.14 |
[코딩 자율학습단 13기] 자바 입문 [1주차] (0) | 2025.02.23 |