본문 바로가기
언어공부/JAVA&SPRING

[패스트캠퍼스 수강 후기] 자바 인강 100% 환급 챌린지 44회차 미션

by hobbiz 2020. 9. 22.
반응형

오늘은 상속에서 클래스 생성 과정과 형변환, 메서드 오버라이딩에 대해 공부해보았다.

 

하위 클래스가 생성될 때 상위 클래스가 먼저 생성된다.

 

super()로 호출되는 생성자는 상위 클래스의 기본 생성자이다.

 

만약 상위 클래스의 기본생성자가 없는 경우 하위 클래스는 명시적으로 상위 클래스의 생성자를 호출해야 한다.

 

 

 

상속에서의 메모리 상태는 아래와 같다.

 

상위 클래스의 인스턴스가 먼저 생성이 되고, 하위 클래스의 인스턴스가 생성된다.

 

상위 클래스로의 묵시적 형변환(업캐스팅)

 

상위 클래스 형으로 변수를 선언하고 하위 클래스 인스턴스를 생성할 수 있다.

 

하위 클래스는 상위 클래스의 타입을 내포하고 있으므로 상위 클래스로 묵시적 형변환이 가능하다.

 

상속관계에서 모든 하위 클래스는 상위 클래스로 묵시적 형변환이 된다.

 

 

클래스 계층구조가 여러단계인 경우를 살펴보면 아래와 같다. 

 

 


 

하위클래스에서 메서드 재정의 하기

 

오버라이딩이란 상위클래스에 정의된 메서드의 구현 내용이 하위 클래스에서 구현할 내용과 맞지 않는 경우 하위 클래스에서 동일한 이름의 메서드를 재정의 할 수 있는 것이다.

 

 

@override 애노테이션(Annotation)

 

재정의된 메서드라는 의미로 선언부가 기존의 메서드와 다른 경우 에러가 발생한다.

애노테이션, 어노테이션은 컴파일러에게 특정한 정보를 제공해주는 역할을 한다.

 

 

<추가공부>

출처: blog.naver.com/springg92/222047601669

 

 

**상속 (Inherit)

클래스와 클래스가 관계를 맺을 수 있는데, 부모-자식관계

한 클래스가 부모가되고 다른 클래스가 자식이 되는 관계

부모가 자식에게 재산상속하듯이 부모클래스가 자식클래스에게 멤버(필드나 메소드)를 상속함

다른 클래스(부모)가 가지고 있는 멤버(필드, 메소드)들을

새로 작성할 클래스에서 직접 만들지 않고 상속을 받음으로써

새 클래스(자식)이 자신의 멤버처럼 사용할 수 있는 기능

-상속의 목적

클래스의 재사용, 코드 중복이 줄어들고 간단해짐

연관된 일련의 클래스들에 대한 공통적인 규약 정의

지금 가지고있는 함수(기능)이 공통적으로 쓰이는 함수라면

내 자식들에게 뿌려줄 수 있음

-상속의 장점

1. 보다 적은 양의 코드로 새로운 클래스 작성 가능

2. 코드를 공통적으로 관리(부모클래스가) 하기 때문에 코드의 추가 및 변경 용이

3. 코드의 중복을 제거하여 프로그램의 생산성/유지보수에 크게 기여

-상속의 특징

1. 모든 클래스는 Object클래스의 후손

Object클래스가 제공하는 메소드를 오버라이딩하여 메소드 재구현 가능

ex) java.lang.String 클래스의 equals()와 toString()

모든클래스에 .을 찍으면 오브젝트 클래스의 메소드를 상속받아 사용가능함을 확인할 수 있음

2. 부모클래스의 생성자, 초기화 블록은 상속 안 됨

자식 클래스 생성 시, 부모 클래스 생성자가 먼저 실행

자식 클래스 생성자 안에 부모 클래스 생성자를 호출하고 싶으면 super() 활용

3. 부모의 private멤버는 상속은 되지만 직접 접근 불가 (해당 클래스 내부에서만 접근가능하기 때문)

자식 객체 생성 시에 부모의 필드 값도 전달 받은 경우,

자식 생성자 안에서 부모의 private 필드에 직접 접근하여 대입 불가

super() 이용하여 전달받은 부모 필드 값을 부모 생성자 쪽으로 넘겨 생성하거나

setter, getter 메소드를 이용하여 접근

-상속 방법

클래스 간의 상속 시에는 예약어 extends 키워드 사용

자식클래스에서 내 부모로 두고싶은 클래스를 extends(확장하다) 뒤에 둠

부모클래스에는 따로 표기X

[접근제한자] class 자식클래스명 extends 부모클래스명 { }

public class Academy extends Company { }

//Academy(자식) Company(부모)

자바에서는 상속이 단일상속밖에 안됨 (다중상속 안됨)

다중상속을 해결하려면 부모 > 자식 > 자식

 

-super()

내 상위 클래스가 목표물

부모 생성자를 호출하는 메소드

후손클래스의 생성자에 기본적으로 부모 생성자가 포함되어 있음

자식객체 안에 부모객체가 또 새로 들어간다 (상속을 받았기땜에)***

후손클래스 생성자 안에는 부모 생성자를 호출하는 super()가 첫 줄에 존재

(부모 생성자가 가장 먼저 실행되어야 하기 때문에 명시적으로 작성 시에도 반드시 첫 줄에만 작성)

매개변수 있는 부모 생성자 호출은 super(매개변수...)를 넣으면 됨

-super. (레퍼런스 변수)

부모클래스의 객체를 가져오는 변수

-오버라이딩

무조건 전제가 상속이 있을때의 얘기

"메소드 재작성" 이라는 단어가 딱 떠올라야 함

자식 클래스가 상속받은 부모 메소드(필드X)를 자기 맘대로 재작성 하는것

부모가 제공하는 기능을 후손이 일부 고쳐 사용함

자식 객체를 통한 실행 시 후손 것이 우선권을 가짐

-오버라이딩 특징

메소드 헤드라인 위에 반드시 Annotation, @Override 표시**

접근 제어자를 부모 것보다 같거나 넓은 범위로 변경 가능

-오버라이딩 성립조건

부모 클래스의 메소드와 자식 클래스의 메소드 비교

- 메소드 이름 동일

- 매개변수의 개수, 타입, 순서 동일

- 리턴 타입 동일 (반환형 봐야함)

- private 메소드 오버라이딩 불가

- final 메소드 오버라이딩 불가

toString 메소드의 목적

Returns a string representation of the object.

그 객체에 대한 대표값을 반환한다.

하지만 모든 클래스가 같은 대표값을 가질 수 없으니

각 객체가 가지고 있는 주소값을 대표값으로 지정해서 반환해버리자 하고 정함

하지만 나는 주소값이 필요 없어. 데이터가 필요한 것임.

그리하여 오버라이딩을 이용하여 toString이 갖는 주소값을 버리고

자식메소드가 원하는대로 메소드 재작성하여 사용한다.

 

자식 메소드가 부모 메소드를 불러와 내 입맛대로 바꾼 것

*예약어 final이 붙을 수 있는 곳은 총 4군데

지역변수(메소드 안에 있는 변수) : 상수, 값 변경 불가

전역변수(필드) : 상수, 값 변경 불가

메소드 : 오버라이딩불가

클래스 : 상속불가

사용 가능한 제어자/예약어

클래스 : public, (default), final, abstract(미완성된,추상)

메소드 : 모든접근제어자, final, abstract, static

변수 : 모든접근제어자, final, static

지역변수 : final

클래스에 abstract와 final 동시에 사용 불가능

메소드에 static과 abstract 동시에 사용 불가능

abstract 메소드의 접근제어자로 private 불가능

패스트캠퍼스 강의: https://bit.ly/3ilMbIO

 

Java 웹 개발 마스터 올인원 패키지 Online. | 패스트캠퍼스

자바 기초문법부터 프로젝트 실습까지 Java 문법부터 스프링/스프링부트, 트렌디한 기술인 JPA까지 모두 배우는 온라인 강의입니다.

www.fastcampus.co.kr

 

반응형

댓글