10월31일 Day14

여우·2022년 10월 31일
0

공부중

목록 보기
8/38

1.클래스의 상속

클래스는 다양한 객체를 카테고리로 나누는 성격을 가지고 있다.

  • 상속이란? 이미 만들어진 클래스의 속성과 기능을 그대로 물려받아서 새로운 클래스를 작성하는것을 말한다.
  • 상속받은 클래스를 그대로 사용하기 보단, 추가 속성을 만들거나, 추가 기능을 정의하여 사용한다.
  • 혹은 상속받은 기능의 형식은 유지하되, 내용을 수정하여 새로 만든다. 이를 오버라이딩이라고 한다.

예시)

  • 2차원의 좌표를 표현할 클래스를 만들고 이를 보여주는 메서드를 작성.
  • 여기서 좌표 하나를 더 추가한 3차원의 좌표를 표현하기 위한 클래스를 작성.

만약 상속을하지 않는다면

이렇게 다시 모든걸 새롭게 정의 해야만 할것이다. 하지만 상속을 받는다면.

이렇게 사용할 수있다.

1) 먼저 새로운 클래스 이름 옆에 extends + 상속받는 클래스의 이름을 적어준다.
2) 그리고 새로 선언 되는 필드가 있다면 멤버필드를 추가해 준다.
3) 상속받은 클래스는 무조건 상속받는 클래스의 생성자를 호출해야 객체를 생성할수있다. 혹시 명시된 생성자가 상속하는 클래스에 없다면 기본생성자가 호출된다.
4) 상속받는 클래스에서 슈퍼클래스의 생성자를 호출할때는 this. 이 아니라 super(매개변수) 로 사용한다.
5) 생성자에서 상속받는 클래스의 매개변수 말고도 추가 되는 변수가 있다면 그 부분은 자기 자신을 가리키는 this.을 사용해서 대입시켜준다.
6) 상속하는 클래스에서 사용하는 메서드를 서브클래스에서 새로사용하고 싶다면 같은 이름의 메서드를 새롭게 정의해서 사용한다는 개념의 오버라이딩을 해야 한다. (오버 로딩은 같은 이름으로 여러 유형을 만들어서 여러 방식으로 사용하는것을 말한다.)

<상속의 정의>

  • 특성을 물려 주는 클래스를 부모 클래스, 슈퍼클래스, 상위 클래스라고 한다.
  • 특성을 물려 받는 클래스를 자식 클래스, 서브클래스, 하위 클래스라고 한다.
  • extends 는 확장하다 라는 뜻이다. 슈퍼 클래스의 개념을 더욱 확장한 새로운 클래스를 말한다
  • 서브클래스는 슈퍼클래스의 생성자를 호출해야 객체를 생성할 수 있다
  • 이때, 명시되지 않으면 슈퍼클래스의 기본생성자를 호출하게 된다
  • 서브클래스의 생성자에서 슈퍼클래스의 생성자를 호출하려면 this대신 super를 사용한다
  • 상속받은 메서드의 형식을 그대로 유지하면서 내용만 새로 작성할 수 있다 (오버라이딩)

<상속받을 때 호출 순서>


Super클래스와 이를 상속받는 Sub클래스 둘을 선언해놓고.
메인문 아래에 Sub 타입으로 객체를 생성하고 출력문을 실행 하게 되면. 결과는

Super 생성자 호출
Sub 생성자 호출
n1 : 10, n2 : 20

이렇게 나온다.

순서는
1) 먼저 메인문 아래의 Sub 타입의 객체 생성문이 실행된다.
2) Sub 클래스로 객체 생성시 매개변수는 int n1 n2를 전달 받게 되는데 일때 먼저 Super 클래스의 생성자가 실행이 되면 super(n1)이 실행이 되어 n1값이 저장이 되고
SUper 클래스의 출력문이 먼저 출력이 된다.
3) 출력이 끝나면 마지막 호출 자리인 super(n1) 다음인 this.n2로 n2가 저장이 되고 Sub 클래스의 출력문이 출력된다.
4) 다시 객체 생성시 호출됐던 자리로 다시 되돌아가서 그다음 실행문인 출력문을 출력하게 된다.

2. 상속된 클래스의 형변환

예를 들어 Human 이라는 클래스를 상속 받는 Student 와 Doctor 클래스가 있다면
Human 클래스에는 없는 각 클래스의 고유 속성이나 기능이 있을 수 있다.


클래스의 고유기능이 아닌 show 부분은 오버라이딩 해두었다면, 객체 생성후 각 객체의 show는 그 클래스 고유 기능에 오버라이딩 된 show 함수로 호출이 될것이다.


만들어진 객체를 상위 개념인 Human 타입으로 참조하는 변수를 만들어준 뒤에도, show()함수를 사용 할 수있다.

show()함수는 오버라이딩되어 각 객체의 새롭게 정의된 방식으로 덮어씌어져서 그렇게 사용이 된다.

하지만 오버라이딩이 되지 않은 Doctor의 heal 함수는 그냥 사용 할수가 없다. Human 타입으로 참조하는 변수로 사용을 하기 위해서는 Human 타입을 강제 형변환 시켜 Doctor로 사용해야 한다.

또한 만든 객체를 Human 타입으로 참조하는 변수를 만들면 이를 하나의 배열로 묶어서 저장하고 사용할수있다.

추상 클래스

  • 추상클래스란? 일반 메서드도 포함 할수 있고, 추상 메서드(미완성 메서드)를 포함할 수도 있다.
  • 추상클래스는 미완성된 내용이 포함되어 있어서, 생성자를 통해서 객체를 직접 생성할수 없다.
  • 추상 메서드는 함수의 형식만 정의 되어 있고, 함수의 내용이 없는 함수이다.
    _ 쉽게 말하자면 강아지, 고양이, 토끼 들을 동물이란 큰 분류로 볼수있는데. 현실에서 강아지, 고양이, 토끼등을 실제로 볼수있는 반면. 동물이란걸 봤다고 말할수가 없다. 이는 현실에 있는 강아지 고양이를 개념화 시켜놓은게 '동물' 이라는 단어로 자바에서도 마찬가지로 이 자체를 사용하기보단 상속받아서 여러 클래스에서 맞춰서 사용 되게 한다.

예시)

동물이라는 추상 클래스를 만들고, 추상메서드도 만들었다. 추상메서는 미완성되어 있어야 하므로, 내용이 없다.
만약 이 Animal을 상속받는 고양이를 만든다면,

서브 클래스이기에 슈퍼클래스의 생성자를 호출해야 하고, 추상 클래스에서 미완성으로 만들어 두었던 메서드는 해당 클래스에 맞게 새로 오버라이딩 하여 정의 해주어야 한다.
그리고 필요하다면 해당클래스의 고유 기능을 추가 하도록 한다.

그리고 메인 클래스에서 Cat 타입의 객체를 만들면.

bark는 오버라이딩 되어있어 호출이 가능하고
grooming은 Cat 클래스의 고유 메서드라 호출이 가능하다.

만약 Cat 타입의 객체를 생성하는데 이를 참조하는 방식이 Animal 방식이라면?

오버라이딩 된 메서드 bark는 이상없이 호출되지만, grooming은 animal 타입으로 수행할수없다. 이럴때는 해당 객체의 클래스 타입을 알아볼수 있는 instanceof를 사용하여 확인하고 다운 캐스팅해서 사용이 가능하다.

a1 의 타입의 객체가 Cat 타입이라면 Cat 타입의 변수 하나를 만들어서 a1을 강제 형변화 시켜서 대입시켜주면. a1의 강제 형변환된 c2로는 grooming을 호출 할수 있다.

  • 동일한 객체를 참조하더라도, 참조되는 자료형(클래스)에 따라서 호출할 수 있는 메서드가 달라진다
  • 단, 오버라이딩 메서드는 슈퍼클래스에 정의되어 있기 때문에 호출할 수 있고
  • 내용을 덮어씌웠기 때문에 호출 후 실행되는 내용은 서브클래스에 작성된 내용을 따른다
profile
우당탕탕 지금은 개발중

0개의 댓글