본문 바로가기

부트캠프 TIL

22.11.08 JAVA 객체지향 다형성, 추상화

이해 안되는게

참조와 형변환이 다른건가

상위 클래스의 타입으로 하위 클래스 타입의 객체를 참조하는 것은 가능하지만, 그 반대는 성립되지 않는다는 것입니다.

참조변수의 타입변환은 서로 상속 관계에 있는 관계에서는 양방향으로 자유롭게 수행될 수 있으나, 상위 클래스로의 타입 변환이냐(괄호 생략 가능) 아니면 하위 클래스로의 타입 변환이냐(괄호 생략 불가)에 따라서 약간의 차이가 있습니다.

하위 클래스로의 타입 변환이 가능한것이야?

 

Child c = (Child)new Parent(); //이렇게 바로 하면 오류

하위 클래스의 객체에 상위 클래스의 인스턴스를 대입하려면 강제 형변환 해줘야.

 

Parent p = new Child();

Child c = (Child)p;

하위 인스턴스를 상위 인스턴스에 넣어준 뒤 하위 클래스로 형 변환하여 넣어줘.

그러면 하위 클래스의 멤버에 접근 가능.

다운캐스팅은 다시말해 업캐스팅 되어있는거를 도로 다운캐스팅 가능하다는 것

 

public class VehicleTest {
    public static void main(String[] args) {
        Car car = new Car();
        Vehicle vehicle = (Vehicle) car; //(Vehicle)생략 가능
//        Car car3 = (Car) new Vehicle(); //run 해보니 이렇게 형변환은 안된다고 하네
        Car car2 = (Car) vehicle; //생략 불가능
//        MotorBike motorBike = (MotorBike) car; //상속이 아니라서 타입변환 불가
    }
}

 

캐스팅 가능 여부를 판단하기 위해서는 두 가지

‘객체를 어떤 생성자로 만들었는가’와 ‘클래스 사이에 상속관계가 존재하는가’를 판단

참조_변수 instanceof 타입

을 입력했을 때 리턴 값이 true가 나오면 참조 변수가 검사한 타입으로 타입 변환이 가능하며, 반대로 false가 나오는 경우에는 타입 변환이 불가능

Object를 타입에 넣으면 당연히 true

자기 자신의 클래스를 타입에 넣으면 true

부모 클래스로 형변환해도 자기 본래 클래스를 타입에 넣으면 true

instance of는 나포함 위로 계층만 true 나와

상속관계 아닌애 넣으면 false

 

원래도 매개변수에 클래스를 넣었던가...

매개변수에 객체 넣을때 따로 new로 객체 생성 안해줘도 되는건가? -생성한걸 참조 변수로 넣는거 같은..데...

매개변수에 참조 변수를 넣는 거랑 객체를 넣는거랑 이게 어찌 되는건지 헷갈린다

매개변수에 객체 new Americano() 를 Coffee coffee 로 할당한건가? 그런거 같은데..

 

toString() 메서드 생략 관련:

모든 클래스의 객체는 그 이름을 출력에 사용하게 되면 자동적으로 toString() 메서드를 호출하게 된다.
toString()을 직접 적어도 되지만 생략가능.

이걸 잊고 있어서 왜 예제서 coffee만 쓰지 하고 있었다.

생략 관련 참조 블로그 https://wickedmagic.tistory.com/60

 

별개로 단순 값만을 복사하여 사용하는 매개변수를 기본형 매개변수라고 하며, 주소의 값이 복사되어 사용하는 매개변수를 참조형 매개변수라고 한다.

 두가지 변수의 가장  차이점은 다음과 같다.

기본형 매개변수는 원천데이터의 값이 변경되지 않지만, 참조형 매개변수의 원천데이터는 메소드에서 값을 변경하면 변경된다.

 

 

갑자기 등장한 throws Exception 어떻게 적용되는질 모르겠다..!!!

 

https://day0404.tistory.com/47

Exception, throw Exception

컴파일 시 발생하는 컴파일 에러, 프로그램이 구동되는 중에 발생하는 런타임 에러가 있습니다.

컴파일 오류의 경우 대체로 문법상의 오류 때문에 많이 발생합니다.

런타임 오류의 경우 설계가 잘못되어 발생하는 경우가 많습니다.

 

그리고 자바에서는 이러한 Exception을 처리하기 위해 java.lang.Exception이라는 최상위 클래스를 제공합니다.

자바에서 기본적인 예외처리는 아래와 같이 try catch 문법을 통해 진행합니다.

try {
	// 실행되어야 할 로직
} catch (예외 클래스) {
	// 예외처리 코드
} finally {
	// 예외와 관계없이 무조건 실행되는 코드
}

try 블록에 실제 실행되어야 하는 코드가 들어가며 Exception이 발생할 가능성이 있는 코드가 들어갑니다.

catch 블록에는 Exception이 발생하면 실행되는 코드가 들어갑니다. 즉 예외처리를 하는 코드입니다.

finally 블럭에는 어떠한 예외가 발생하더라도 반드시 실행되어야 하는 코드가 들어가는 곳입니다.

 

예외 던지기

일단 throw의 경우 개발자가 의도적으로 예외를 발생시키는 것입니다.

throw라는 키워드를 이용하며, 주로 비즈니스 로직을 구현하는 과정 중 컴파일에는 문제가 없지만 해당 비지니스 로직이 개발자가 의도한 대로 통과하지 못했을 경우 고의로 예외를 발생시켜야 할 때 사용합니다.

throws의 경우 메서드 내에서 예외처리를 하지 않고 해당 메서드를 사용한 곳에서 예외 처리를 하도록 예외를 위로 던지는 것입니다. 예외를 전가하는 것 입니다.

 

의존성 주입 DI 스프링에서 핵심.

이해하길