24.09.02(상속, 조합, 형변환, 다형성)

jiiiiiiiArchive.·2024년 9월 2일

🤯지식주머니🤯

목록 보기
8/98
post-thumbnail

상속(Inheritance)

  • 자식 클래스가 부모 클래스의 기능을 그대로 물려받음
  • 보통 부모 클래스를 상속받은 자식 클래스는 부모 클래스의 기능에 더하여 좀 더 많은 기능을 갖도록 작성할 수 있음.
class Animal {
    String name;

    void setName(String name) {
        this.name = name;
    }
}

// 클래스 상속을 위해서는 'extends' 키워드 사용
class Dog extends Animal {  // Animal 클래스를 상속한다.
	// Dog 클래스에 객체 변수인 name과 메서드인 setName을 만들지 않았다.
    // Animal 클래스를 상속했기 때문에 사용이 가능
    
	void sleep() { // sleep 메서드 추가 => Dog클래스는 Animal 클래스보다 더 많은 기능을 가지게 되었다.
        System.out.println(this.name+" zzz");
    }
}

public class Sample {
    public static void main(String[] args) {
        Dog dog = new Dog();
        dog.setName("poppy");
        System.out.println(dog.name);
        dog.sleep();
    }
}

// 결과 : poppy
//       poppy zzz
  • IS-A 관계

    • Dog is a Animal(개는 동물이다)
    • IS-A 관계에 있을 때 자식 클래스의 객체는 부모 클래스의 자료형인것처럼 사용할 수 있다.
    Animal dog = new Dog();  // Dog is a Animal(O)
                             // Dog으로 만든 객체는 Animal 자료형이다.
    • Dog 객체를 Aimal 자료형으로 사용할 경우 Dog클래스에만 존재하는 sleep 메서드 사용 불가.
    • 부모 클래스로 만들어진 객체를 자식 클래스의 자료형으로는 사용할 수 없다.
    Dog dog = new Animal();  // 컴파일 오류
                             // Animal is a Dog(X)
                             // Animal로 만든 객체는 Dog 자료형이다.
  • 메서드 오버라이딩(method overriding) : 부모 클래스의 메서드를 자식 클래스가 동일한 형태로 또다시 구현 = 메서드 덮어쓰기

class Animal {
    String name;

    void setName(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    void sleep() {
        System.out.println(this.name+" zzz");
    }
}

class HouseDog extends Dog {
}

public class Sample {
    public static void main(String[] args) {
        HouseDog houseDog = new HouseDog();
        houseDog.setName("happy");
        houseDog.sleep();  // happy zzz 출력
    }
}
class Animal {
    String name;

    void setName(String name) {
        this.name = name;
    }
}

class Dog extends Animal {
    void sleep() {
        System.out.println(this.name + " zzz");
    }
}

class HouseDog extends Dog {
    void sleep() {
        System.out.println(this.name + " zzz in house");
        // Dog 클래스에 있는 sleep 메서드를 HouseDog 클래스에 다시 구현
        // HouseDog 클래스의 sleep 메서드가 Dog 클래스의 sleep 메서드보다 우선순위 가짐
    }
}

public class Sample {
    public static void main(String[] args) {
        HouseDog houseDog = new HouseDog();
        houseDog.setName("happy");
        houseDog.sleep();  // happy zzz in house 출력
    }
}
  • 다중 상속 : 자바는 다중 상속을 지원하지 않는다.

조합(Composition)

  • has or is a part of
  • 클래스를 구성하는 부분의 합으로 정의
public class House {
	private Bedroom bedroom;
    private LivingROom livingroom;
    //...
  • 조합을 통해 생성된 클래스와 객체는 느슨하게 결합(loosely coupled) => 코드를 손상시키지 않고 구성 요소를 바꿀 수 있다.

형변환(Casting)

기본형 변수
  • 자료형(타입)이 같은 것만 변수에 저장
        int num = 10; // 정수 변수
        double num2 = 10.1; // 실수 변수
        
        num = num2; // num2값을 num에 대입 -> X. double타입이 int타입에 대입될 수 없다.
        
        num2 = num; // num의 값을 num2에 대입 => O. int타입이 double타입에 대입되었다.(X)
        // => int타입이 double타입으로 모습을 바꿔서(형변환) 대입되었다.(O)
        
        System.out.println(num2);
        
        // 정수가 실수가 되는 것은 안전. 10 => 10.0, 100 => 100.0
        // 실수가 정수가 되는 것은 위험. 10.3 => 10, 3.14 => 3

        // 안전한 변환은 자바가 대신 해줌. (자동형변환)
        // 위험한 변환은 자바가 막음. 에러가 나고, 개발자가 강제로 변환은 가능(수동 형변환)

        num2 = num; // 안전한 자동 형변환
        num = (int)num2; // 값 앞에 () 표현으로 형변환을 강제로 시도할 수 있다.
객체 형변환
Parent parent = new Child();
  • 좌항과 우항의 객체 유형이 서로 다른 경우 + 두 유형이 서로 상속관계에 있고 왼쪽 객체가 오른쪽 객체의 상위 클래스인 경우 => 암묵적 형변환

  • 하위 클래스 -> 상위 클래스로 할당하는 것 가능하나 반대의 경우에는 명시적 형변환 필요

  • 암묵적 형변환

    • 객체가 상위클래스의 형태로 형변환되더라도 오버라이드된 자신의 기능은 잃지 않음
    • 추가적으로 구현한 기능은 사용불가
  • 명시적 형변환

    • 하위 클래스 형태로 명시적 형변환을 함으로써, 자신들의 독립 기능(메서드)들을 사용할 수 있다.

다형성(polymorphism)

  • 상속 기반
  • 코드 중복 최소화, 유지보수 용이성, 확장성
  • 상위 클래스가 동일한 메시지로 하위 클래스를 서로 다르게 동작시키는 객체지향 이론
  • 하나의 객체가 여러 개의 자료형 타입을 가질 수 있음
Tiger tiger = new Tiger();  // Tiger is a Tiger
Animal animal = new Tiger();  // Tiger is a Animal
Predator predator = new Tiger();  // Tiger is a Predator
Barkable barkable = new Tiger();  // Tiger is a Barkable

// 각 객체는 사용할 수 있는 메서드가 서로 다르다.
profile
이것저것 다 적는 기록장📚

0개의 댓글