본문 바로가기

language/자바

[java] 상속에서 조심해야 하는 점

상속이 무엇인지는 다른 기술 블로그에도 많기 때문에 간단한건 넘어가고 설명을 한다.

 

우리는 객체지향프로그래밍을 하고있기때문에 

선언을 할때

상위 = new 하위(); 이런 것의 장점을 알아야한다.

.

사용하는 ArrayList도 선언할때 다음과 같은 형태로 작성하는 것이 좋다.

List<> list1 = new ArrayList<>();
List<> list2 = new LinkedList<>();

 

 

여기서 조심해야할 점 !!!

 

 

다음을 예로 들어보자

Animal 이라는 상위 클래스가 있고

Wolf 와 dog라는 하위 클래스가 있다. 각각 클래스는 Animal을 상속받는다.

 

class Animal{
	void bark(){
    	System.out.println("짖다!");
    }
}

class Wolf extends Animal{
	void changeToHuman(){
    	System.out.println("늑대인간이 되었다");
    }
}

class Dog extends Animal{
}

Wolf와 Dog는 bark()를 사용할수있고

Wolf는 changeToHuman() 까지 사용할수 있다.

 

근데 여기서

상위 = new 하위(); 

이 방식일때 문제가 생긴다.

 

Wolf는 Animal의 하위클래스임에도 불구하고 해당 코드는 에러가 발생한다.

 

이유는 type이 Animal인데 해당 클래스에는 changeToHuman() 이라는 메소드가 없기때문이다

 

즉, 타입에 의해 지배 받기때문에 사용할수 없다는 것이다.

 

 

 

 

해당코드를 굳이굳이 쓰는 방법이있다.

w2를 다운캐스팅 하는것이다.

w2의 타입은 상위 클래스인 Animal이다. 

Wolf w3 = (Wolf)w2;

Animal 타입을 Wolf 타입으로 강제 형변환을 한것이다.

 

하지만 이러한 코드는 좋지 못한 코드이다.

 

 

※※※※※※※※※※※※※※※※※※※※※※※※※※※※

 

좋고 나쁨이 아닌 개발의 스타일

 

상위 = new 하위();

상위 객체의 필드 메소드를 쓸수있다.

 

하위 = new 하위();

상위 및 하위가 가진 메소드를 쓸 수있다.

 

 

 

 

 

잘 된 케이스에서는

하위 클래스에서 상위에 없는 별도 메소드 구현 하지 않았을때

상위 클래스의 메소드만으로 구조 파악이 쉽지만

실제 개발을 하면 그런일은 드문가보다

상위 메소드만으로 깔끔하게하는,..?

스타일차이?? 암튼..

 

※※※※※※※※※※※※※※※※※※※※※※※※※※※※

 

 

또다른 점!

 

private 이면 상속이 안된다???

 

아니다!!!

 

상속을 받으면 상위 클래스에서 하위 클래스로 모두 상속되는것이다.

하지만!!

접근을 못하게 private이 막고있어서 사용을 못한다는 것이다.

이러한 것을 사용하는 방법으로는 

getter와 setter가 있다. 혹시나 쓰는 이유가 궁금하다면!

 

https://nsmchan.tistory.com/40

 

getter와 setter

getter와 setter를 왜 쓰는걸까? 이유는 외부에서 제한없이 접근하는 것을 방지하는 것이다. (캡슐화, 객체무결성...) 정확히 말하자면 private 접근제한자로 아무나 접근을 못하게하고 getter와 setter로

nsmchan.tistory.com

 

 

 

 

 

 

 

 

※※※※※※※※※※※※※※※※※※※※※※※※※※※※

 

상속의 장점

 

코드의 재사용 -  상속받았을때 상위것을 사용할수있음.

강력하고 자연스러운 조직화 - 각각 개별의 클래스들이 연결을 맺을수 있음

상속에서의 다형성 - 오버라이딩 

* 오버로딩은 상속하고는 무관

 

 

**

오버로딩

이름같고 파라미터 타입이 다를때

이름같고 파라미터 개수가 다를때

이름같고 리턴타입이 다를때

 

오버라이딩

이름 같고 파라미터도 같아야된다!

리턴타입이 다른데 만약 자동 형변환이 된다면 허용

 

 

'language > 자바' 카테고리의 다른 글

[java] default method 디폴트 메소드 (feat. abstract class)  (0) 2022.07.18
[java] abstract 추상화  (0) 2022.07.14
[java]static의 사용이유  (0) 2022.07.11
getter와 setter  (0) 2022.05.31
자바 HttpServletRequest  (0) 2022.01.27