Post

[Day11] OOP 3대 concept

[Day11] OOP 3대 concept

[오늘 수업 흐름]

  • 배열 훑기
  • 자바 oop
  • class diagram

자바 배열에 요소 추가

  • Java의 배열은 크기가 고정된 불변 객체이므로, 한 번 생성된 배열의 크기를 변경할 수 없다.
  • 따라서 push() 같은 메서드로 요소를 추가할 수 없다.
  1. 새로운 배열을 생성하여 복사
    • 기존 배열보다 크기가 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; // 기존 배열 참조 변경
  1. 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(다형성)

  • 목적: 같은 메서드나 객체가 다양한 방식으로 동작하도록 함

종류

  1. 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() 메서드가 호출됨!
  1. 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() 호출 (다형성)
    }
}
  1. 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

  1. Access Modifier
    • private < (default) < protected < public
    • 적용 대상: 클래스, 메서드, 변수
      • 클래스에는 public, (default)만 사용 가능
      • 메서드와 변수는 4가지 모두 가능
  2. 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.