[Day11] OOP 3대 concept
[Day11] OOP 3대 concept
[오늘 수업 흐름]
- 배열 훑기
- 자바 oop
- class diagram
자바 배열에 요소 추가
- Java의 배열은 크기가 고정된 불변 객체이므로, 한 번 생성된 배열의 크기를 변경할 수 없다.
- 따라서 push() 같은 메서드로 요소를 추가할 수 없다.
- 새로운 배열을 생성하여 복사
- 기존 배열보다 크기가 1 큰 새로운 배열을 만들고, 기존 배열의 요소를 복사한 후 새로운 요소를 추가한다.
1
2
3
4
5
6
7
8
9
10
11
int ages[] = {20, 22, 18, 35, 48, 26, 87, 70};
ages.push(33); // err
// 배열은 불변하기 때문에 push로 넣을 수 없음
// ages가 가리키는 다른 배열을 만들어야됨
int newElement = 33;
int[] newAges = new int[ages.length + 1]; // 새로운 배열 생성
System.arraycopy(ages, 0, newAges, 0, ages.length); // 기존 배열 복사
newAges[newAges.length - 1] = newElement; // 새 요소 추가
ages = newAges; // 기존 배열 참조 변경
- ArrayList 사용
- 배열 대신 ArrayList
를 사용하면 가변적인 크기로 요소를 추가할 수 있다.
- 배열 대신 ArrayList
1
2
3
4
5
6
7
8
9
import java.util.ArrayList;
import java.util.Arrays;
public class Main {
public static void main(String[] args) {
ArrayList<Integer> agesList = new ArrayList<>(Arrays.asList(20, 22, 18, 35, 48, 26, 87, 70));
agesList.add(33); // 요소 추가
}
}
💡 더 유연한 자료구조가 필요하면 ArrayList를 사용하는 것이 좋다.
OOP 3대 concept
Encapsulation(은닉화)
- 목적 : 데이터를 보호하고, 외부에서 직접 접근하지 못하도록 제한
- 데이터(변수): private 선언
- 메서드: 접근 제한자(public, protected, private, (default))를 적절히 사용
Inheritance(상속)
- 목적: 기존 클래스의 기능을 재사용하고 확장
- 단일 상속: extends 키워드 사용 (ChildClass extends ParentClass)
- 한 클래스가 오직 하나의 부모(super) 클래스만을 상속 받을 수 있음.
- 부모 클래스를 기반으로 하위 클래스를 만들고, 추가적인 기능을 구현
Polymorphism(다형성)
- 목적: 같은 메서드나 객체가 다양한 방식으로 동작하도록 함
종류
- Polymorphic Variable (다형적 변수)
- 부모(슈퍼) 클래스 타입으로 선언된 변수가 자식 클래스의 객체를 참조할 수 있는 변수
- 🚀 즉, 부모 타입으로 선언한 변수에 자식 객체를 담을 수 있다!
- shadow effect가 생김 (슈퍼 타입 아래의 멤버들이 가려지는 효과)
- 부모(슈퍼) 클래스 타입으로 선언된 변수가 자식 클래스의 객체를 참조할 수 있는 변수
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Animal { // 부모 클래스
void sound() {
System.out.println("동물이 소리를 냅니다.");
}
}
class Dog extends Animal { // 자식 클래스
void sound() {
System.out.println("멍멍!");
}
}
public class Main {
public static void main(String[] args) {
Animal myAnimal = new Dog(); // 부모 타입(Animal) 변수에 자식 객체(Dog)를 참조
myAnimal.sound(); // 멍멍!
}
}
// ✅ myAnimal은 Animal 타입이지만, 실제로는 Dog 객체를 참조하므로 오버라이딩된 sound() 메서드가 호출됨!
- Overriding (재정의)
- 부모(슈퍼) 클래스의 메서드를 자식 클래스에서 재정의 (내용 변경)
- 확장성, 성능, 정합성 향상
- super 키워드를 사용하여 부모 메서드 호출 가능
- shadow effect가 적용되는 않는 예외 메소드
- 부모 클래스의 메서드 이름, 반환 타입, 매개변수는 그대로 유지해야 함
- 부모(슈퍼) 클래스의 메서드를 자식 클래스에서 재정의 (내용 변경)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
class Parent {
public void area() { // 부모 클래스의 area() 메서드
System.out.println("부모 클래스의 area()");
}
}
class Child extends Parent {
@Override
public void area() { // 부모의 area()를 오버라이딩(재정의)
System.out.println("자식 클래스의 area()");
}
}
public class Main {
public static void main(String[] args) {
Parent p = new Parent();
p.area(); // 부모의 area() 호출
Child c = new Child();
c.area(); // 자식의 area() 호출
Parent pc = new Child();
pc.area(); // 자식의 area() 호출 (다형성)
}
}
- Overloading(중복 정의)
- 한 클래스 내에서 같은 이름의 메서드가 다수 존재하는 것
- 단, 매개변수의 타입 또는 개수가 달라야 함
- (ex) PrintStream의 println 다수
- 한 클래스 내에서 같은 이름의 메서드가 다수 존재하는 것
🔹 Generalization (일반화)
- 하위 개념(특수한 개념)들을 상위 개념(더 일반적인 개념)으로 묶는 과정
- 여러 개의 유사한 개체나 클래스를 공통적인 특성을 가진 상위 개체나 클래스로 추상화하는 것을 의미함.
- 예시:
- “이예은”, “이창수(이예은 아빠)” → 성씨를 기준으로 보면 “이씨들”라는 더 일반적인 개념으로 묶을 수 있음.
1
2
3
4
5
6
7
8
9
10
11
class Animal {
void makeSound() { System.out.println("Some sound"); }
}
class Dog extends Animal {
void makeSound() { System.out.println("Bark"); }
}
class Cat extends Animal {
void makeSound() { System.out.println("Meow"); }
}
🔹 Specialization (특수화)
- 일반적인 개념에서 특정한 특징을 가진 하위 개념으로 세분화하는 과정
- 상위 개념에서 특정 속성을 추가하여 더 구체적인 하위 개념을 정의하는 것
- “한국 성씨”에서 “이씨들”을 구분하는 것
1
2
3
4
5
6
7
class Animal {
void move() { System.out.println("Animals can move"); }
}
class Fish extends Animal {
void move() { System.out.println("Fish swims"); } // 특수화된 기능 추가
}
💡 쉽게 말하면:
Generalization: 여러 개를 합쳐서 공통적인 특성을 추출 (ex: 개, 고양이 → 동물)
Specialization: 하나를 세분화하여 특정한 특성을 추가 (ex: 동물 → 개, 고양이)
interface
- 목적: 다중 상속을 지원하는 프로그래밍 단위
- interface 키워드를 사용하여 정의
- 인터페이스를 구현하는 클래스는 implements 사용
- 인터페이스 내의 모든 메서드는 기본적으로 public abstract
- 다중 인터페이스 구현 가능 (class A implements Interface1, Interface2)
Modifier
- Access Modifier
- private < (default) < protected < public
- 적용 대상: 클래스, 메서드, 변수
- 클래스에는 public, (default)만 사용 가능
- 메서드와 변수는 4가지 모두 가능
- Usage Modifier (사용 지정자)
- static : 객체 생성 없이 사용하라
- class : inner class에만 선언
- data : 공유하는 데이터
- method : 객체 생성 없이 호출 가능한 메소드
- abstract : 상속으로만 사용하라 (객체 생성 불가)
[study 시간] : 상속 관계의 도메인 만들기
assiciation(연관관계)
두 클래스가 연관되어 있을 때 사용, User-Order(사용자가 주문을 한다)
aggregation(집합관계)
전체와 부분 관계, Cart-Product(장바구니는 여러개의 상품을 포함하지만, 상품은 독립적으로 존재 가능)
dependency(의존관계)
한 클래스가 다른 클래스를 사용하는 경우(Order - Payment)
참고한 클래스 다이어그램
팀에서 만든 클래스 다이어그램
This post is licensed under CC BY 4.0 by the author.