1. 오늘 학습 주제
배열의 심화 개념과 객체지향의 기초를 함께 학습했다.
특히 2차원 배열을 다루는 방법, 배열의 얕은 복사와 깊은 복사 차이, 정렬 알고리즘의 동작 원리, 그리고 클래스를 이용한 사용자 정의 자료형과 캡슐화 개념까지 이어서 정리할 수 있었다.
- 2차원 배열과 가변 배열 이해하기
- 학생 점수 예제로 2차원 배열 활용하기
- 얕은 복사와 깊은 복사 차이 이해하기
- 향상된 for문과 일반 for문의 차이 익히기
- 선택 정렬, 버블 정렬 동작 원리 학습하기
- Arrays.sort() 사용하기
- 배열을 활용한 로또 번호 생성하기
- 클래스와 객체 개념 이해하기
- 사용자 정의 자료형 만들기
- 캡슐화와 getter, setter 사용하기
2. 2차원 배열
2차원 배열은 배열 안에 또 다른 배열이 들어 있는 구조이다.
즉, 1차원 배열 여러 개를 하나로 묶어서 관리하는 방식이라고 이해할 수 있다.
int[][] iarr = new int[3][5];
int[][] iarr2 = {{1,2,3,4,5}, {6,7,8,9}, {10,11,12}};
- int[][] 형태로 선언한다.
- 행과 열 개념으로 데이터를 저장할 수 있다.
- 행마다 길이가 같은 배열은 정변 배열, 길이가 다른 배열은 가변 배열이다.
- 중첩 반복문을 사용해 값을 넣고 출력할 수 있다.
3. 가변 배열
가변 배열은 각 행의 길이가 서로 다른 2차원 배열이다.
int[][] iarr = new int[3][];
iarr[0] = new int[3];
iarr[1] = new int[2];
iarr[2] = new int[5];
- 먼저 행의 수만 정해서 배열을 만든다.
- 이후 각 행마다 다른 길이의 배열을 따로 할당한다.
- 데이터 구조가 일정하지 않을 때 유용하게 사용할 수 있다.
4. 2차원 배열 활용
학생별 과목 점수를 저장하고 총점과 평균을 계산하는 예제를 통해 2차원 배열 활용 방식을 익혔다.
int[][] scores = {
{80, 77, 85},
{78, 60, 97},
{90, 80, 68}
};
- 각 행은 학생 1명, 각 열은 과목 점수를 의미한다.
- 바깥 반복문은 학생 단위, 안쪽 반복문은 과목 단위로 순회한다.
- 합계와 평균 계산 같은 문제에 2차원 배열이 자주 쓰인다.
5. 배열 복사
배열 복사는 크게 얕은 복사와 깊은 복사로 나뉜다.
5.1 얕은 복사
int[] originArr = {1,2,3,4,5};
int[] copyArr = originArr;
- 주소값만 복사한다.
- 두 변수가 같은 배열을 참조한다.
- 한쪽 값을 바꾸면 다른 쪽에서도 그대로 반영된다.
5.2 깊은 복사
int[] copyFor = new int[originArr.length];
for(int i=0; i<originArr.length; i++){
copyFor[i] = originArr[i];
}
- 새로운 배열을 만들고 값을 하나씩 복사한다.
- 원본과 사본이 서로 독립적이다.
- 한쪽을 수정해도 다른 쪽에는 영향이 없다.
깊은 복사 방법도 여러 가지를 확인했다.
- for문으로 직접 복사
- Arrays.copyOf()
- System.arraycopy()
- clone()
6. 향상된 for문
향상된 for문은 배열을 처음부터 끝까지 간단하게 순회할 때 유용하다.
for(int value : arr){
value += 10;
}
- 배열 값을 읽는 용도로 편리하다.
- 하지만 value는 임시 변수이므로 원본 배열 값은 바뀌지 않는다.
- 배열 자체를 수정하려면 일반 for문을 사용해야 한다.
for(int i=0; i<arr.length; i++){
arr[i] += 10;
}
7. 정렬
배열 원소의 위치를 바꾸는 기본 원리부터 정렬 알고리즘까지 학습했다.
7.1 값 교환
int temp = num1;
num1 = num2;
num2 = temp;
- 두 값을 서로 바꾸려면 임시 변수 temp가 필요하다.
- 정렬은 결국 비교와 교환의 반복이다.
7.2 선택 정렬
for(int i=0; i<arr.length-1; i++) {
int minIndex = i;
...
}
- 가장 작은 값을 찾아 앞쪽으로 보내는 방식이다.
- 한 회차가 끝날 때마다 앞에서부터 정렬이 확정된다.
7.3 버블 정렬
for(int i=arr.length-1; i>=0; i--) {
for(int j=0; j<i; j++) {
if (arr[j] > arr[j + 1]) {
...
}
}
}
- 인접한 두 값을 비교하며 큰 값을 오른쪽으로 밀어낸다.
- 한 회차가 끝나면 가장 큰 값이 맨 뒤에 위치한다.
7.4 Arrays.sort()
Arrays.sort(arr);
- 자바가 제공하는 정렬 기능이다.
- 직접 알고리즘을 구현하지 않아도 빠르게 정렬할 수 있다.
8. 배열 응용: 로또 번호 생성
배열과 난수, 중복 검사, 정렬을 조합해 로또 번호 생성 예제도 학습했다.
arr[i] = (int)(Math.random() * 45) + 1;
- 1~45 범위의 난수를 만든다.
- 중복이 나오면 다시 뽑도록 처리한다.
- 마지막에 Arrays.sort()로 정렬해 보기 좋게 출력할 수 있다.
배열 활용이 단순 저장을 넘어서 실제 로직 구현으로 이어질 수 있다는 점을 느꼈다.
9. 클래스와 객체
이전까지는 기본 자료형 위주로 데이터를 다뤘다면, 여러 속성을 하나로 묶기 위해 클래스를 사용하는 방법을 배웠다.
Member member = new Member();
- 클래스는 객체를 만들기 위한 설계도이다.
- new 연산자를 사용해 실제 객체를 생성한다.
- 생성된 객체는 참조 변수에 주소값을 저장해 사용한다.
Member 클래스에는 여러 속성이 담겨 있었다.
String id;
String pwd;
String name;
int age;
char gender;
String[] hobby;
- 관련 있는 데이터를 하나의 타입으로 묶어서 관리할 수 있다.
- 이것이 사용자 정의 자료형의 핵심이다.
10. 사용자 정의 자료형 활용
Member 객체에 아이디, 비밀번호, 나이, 성별, 취미 등을 저장하면서 클래스의 장점을 확인했다.
member.id = "user01";
member.age = 27;
member.hobby = new String[]{"축구", "볼링", "테니스"};
- 여러 속성을 하나의 객체에 담을 수 있다.
- 기본 자료형만으로는 표현하기 어려운 구조를 더 자연스럽게 만들 수 있다.
- 현실 세계의 개념을 코드 안에서 하나의 객체로 표현할 수 있다.
11. 캡슐화
객체지향에서는 필드를 무조건 외부에 공개하지 않고, 필요한 메서드를 통해 접근하도록 만드는 캡슐화가 중요하다.
private int age;
- private을 사용하면 외부에서 직접 접근할 수 없다.
- 객체 내부 상태를 보호할 수 있다.
- 잘못된 값이 들어오는 것을 막을 수 있다.
예제에서는 setter로 나이를 설정하고, getter로 값을 읽어왔다.
public void setAge(int age) {
if(age >= 0){
this.age = age;
} else {
System.out.println("나이는 음수일 수 없어!!");
this.age = 0;
}
}
public int getAge() {
return age;
}
- setter는 값 저장 전에 검증 로직을 넣을 수 있다.
- getter는 외부에 필요한 값만 안전하게 전달할 수 있다.
- 캡슐화는 유지보수성과 안정성을 높이는 중요한 원칙이다.
12. 오늘 학습 흐름 정리
12.1 배열 심화
- 2차원 배열과 가변 배열 학습
- 학생 점수 예제로 총점과 평균 계산
- 얕은 복사와 깊은 복사 차이 이해
- 향상된 for문과 일반 for문 비교
- 선택 정렬, 버블 정렬, Arrays.sort() 학습
- 로또 번호 생성 예제로 배열 응용
12.2 객체지향 기초
- 클래스와 객체 개념 학습
- Member 클래스로 사용자 정의 자료형 만들기
- 필드에 여러 속성 저장하기
- private, getter, setter를 이용한 캡슐화 학습
13. 오늘 배운 핵심 정리
- 2차원 배열은 배열 안에 배열이 들어 있는 구조이다.
- 가변 배열은 각 행의 길이가 서로 다를 수 있다.
- 2차원 배열은 학생별 점수, 표 형태 데이터 등에 활용할 수 있다.
- 얕은 복사는 주소값만 복사하고, 깊은 복사는 실제 값을 새 배열에 복사한다.
- 향상된 for문은 읽기에는 편하지만 원본 배열 수정에는 적합하지 않다.
- 정렬은 비교와 교환의 반복으로 이루어진다.
- 선택 정렬과 버블 정렬은 기본 정렬 원리를 이해하는 데 도움이 된다.
- Arrays.sort()를 사용하면 배열을 간단하게 정렬할 수 있다.
- 클래스는 객체를 만들기 위한 설계도이고, 객체는 그 설계도를 바탕으로 만든 실제 데이터이다.
- 사용자 정의 자료형을 사용하면 관련 있는 여러 데이터를 하나로 묶을 수 있다.
- 캡슐화는 필드 직접 접근을 막고 메서드를 통해 안전하게 다루는 방식이다.
- getter와 setter는 객체의 상태를 보호하면서 필요한 접근만 허용하는 도구이다.
'TIL > [TIL]' 카테고리의 다른 글
| [TIL]static, final, singleton, 변수의 종류, 초기화 블록, 객체 배열 (0) | 2026.05.06 |
|---|---|
| [TIL]추상화, DTO, 생성자, 메서드 매개변수와 오버로딩 (0) | 2026.05.04 |
| [TIL]Java 제어문과 배열 (0) | 2026.04.30 |
| [TIL]Java 기초 문법, 연산자, 메서드와 패키지/임포트 (0) | 2026.04.29 |
| [TIL]Java Literal과 자료형 연산 이해 (0) | 2026.04.28 |