[JAVA] 상속 / 다형성 (Override, Overload)

형이·2023년 7월 10일
0

JAVA

목록 보기
8/19
post-thumbnail

📝 Day 6

🖥️ 1. 상속

1-1. 클래스 간의 상속이란

📎 클래스 간에는 부모 / 자식의 상속 관계를 설정할 수 있다

📎 부모 클래스 'A'를 자식 클래스 'B'가 상속 받을 때, B는 A의 모든 멤버변수와 매서드를 자신의 것으로 상속 받게 된다. (단, private로 설정된 기능은 상속되지 않음)

📎 상속 가능 여부 : public, protected

📎 B는 A의 publid, protected 기능들을 직접적으로 코딩하지 않더라도 자신의 것으로 사용할 수 있게 된다

1-2. 상속 정의 방법

📎 extends 키워드를 사용하여 부모 클래스의 이름을 명시

	public class 자식클래스 extends 부모클래스 {...}

1-3. 클래스 다이어그램을 통한 상속의 표현

📎 클래스의 구조를 표현하는 클래스 다이어그램에서 상속은 자식 클래스가 부모 클래스를 가리키는 화살표로 표현

📎 상속관계가 이루어질 때, 부모 클래스를 uper 클래스라고 한다

1-4. 상속의 활용(1)

📎 기존에 존재하는 클래스의 수정 없이 기능을 확장하고자 하는 경우

📎 CalcChild 클래스는 CalcParent 클래스를 상속받기 때문에 별도의 소스 코딩 없이도 plus()메서드와 minus() 메서드를 포함하게 된다

📎 CalcChild 클래스에 times()메서드와 divide() 메서드를 추가하면 상속 받은 메서드에 새로운 기능을 추가하는 효과를 얻을 수 있다

1-5. 상속의 활용(2)

📎 여러개의 클래스에 공통되는 기능을 추출하여 공유하기

📎 질문/답변 게시물의 한 단위를 표현하기 위한 QNAArticle, 클래스와 자료실의 게시물을 표현하기 위한 FileArticle은 글 번호와 제목이라는 공통된 특성을 갖는다

📎 공통 기능을 별도의 클래스로 추출해내면 코드의 재사용 및 수정이 용이


🖥️ 2. 다형성 - 오버라이딩 (Override)

2-1. 다형성을 구현하기 위한 Override

📎 육군(Army), 해군(Navy), 공군(AirForce)

📎 Unit이라는 클래스를 통해서 공통 속성 정의

→ 이름(멤버변수, getter, setter) / 공격(attack())

📎 같은 이름이지만 다른 동작을 수행해야 하는 필요성

→ 모든 군대는 '공격'이라는 공통된 특성을 갖지만 공격하는 방법은 육/해/공군이
 서로 다르게 처리되어야 한다.

📎 부모 클래스가 갖고 있는 기능을 자식 클래스가 재정의

→ 부모 클래스에 정의된 것과 동일한 이름을 갖는 메서드를 자식 클래스가 정의한 경우,
  부모 클래스의 기능은 자식에게 가려진다.

  🔎 이렇게 부모의 기능을 재정의하는 것을 "메서드 Override"라고 한다.

📌 하나의 이름으로 다양한 효과 얻기

 📎 모든 자식 클래스가 동일한 이름의 메서드를 갖게되므로 각 객체에 대하여 attack( )이라는 이름을 사용하여 서로 다른 형태를 구현할 수 있게 된다

2-2. super 키워드

📌 클래스의 상속관계에서 자식 클래스가 부모 클래스를 가리키는 예약어

📌 사용방법

 📎 멤버변수 이름 앞에 명시

	부모 클래스의 멤버변수를 의미한다.

    하지만 부모 클래스의 멤버변수는 이미 모두 상속되어 있기 때문에
    이 경우에는 this 키워드를 사용하는 것과 동일한 결과이기에 잘 사용하지 않음

 📎 메서드 이름앞에 명시

	부모 클래스의 메서드를 의미

	· 재정의 되지 않은 메서드 → 이미 상속되어 있기 때문에 this 키워드를 사용하는 것과 같은
    						동일한 결과를 갖는다.

	· 재정의 된 메서드 → Override 된 메서드 이름 앞에 사용하게 되면 재정의되기 이전의
					  원본 메서드를 의미한다.

 📎 키워드 자체를 메서드처럼 사용

	: super()
	→ 부모 클래스의 생성자를 의미

2-3. 생성자가 정의된 클래스의 상속 제한

📎 생성자는 상속되지 않는다

📎 하지만 생성자가 정의된 클래스는 객체 생성을 위해서 생성자 파라미터를 반드시 전달받아야 하기 때문에 파라미터를 갖는 생성자가 정의된 클래스를 상속 받게 되면 에러가 발생

2-4. @Override

📎 메서드 재정의 과정에서의 오타 방지 옵션

📎 @Override는 이 키워드가 명시된 위치 아래에 정의되는 메서드가 부모 클래스에 존재하지 않을 경우 구문 에러로 처리

📎 부모 클래스의 메서드를 재정의 하고자 할 경우, 의도치 않은 실수를 예방하기 위한 오타 방지 옵션이다

📎 여러 개의 메서드를 재정의 한다면 재정의되는 모든 메서드들 위에 각기 명시해야 한다

2-5. 자바 최상위 클래스

📎 Object 클래스


🖥️ 3. 다형성 - 오버로드 (Overload)

1-1. 메서드 오버로드

📌 원칙적으로 하나의 클래스 안에서는 동일한 이름의 메서드가 두 개 이상 존재할 수 없지만, 이를 가능하게 하는 예외적인 처리 기법

  • 이름이 동일한 메서드를 정의하기 위한 조건

 📌 메서드 간의 파라미터가 서로 달라야 한다

   📎 파라미터의 데이터 타입이 다르다

     (테이터형이 동일하고 변수의 이름이 다른 경우는 동일한 파라미터로 인식)

   📎 파라미터의 개수가 다르다

   📎 서로 다른 데이터형을 갖는 파라미터들의 전달 순서가 다르다

 📌 리턴형이 다른 경우는 오버로드의 성립에 아무런 영향을 주지 않는다

🔎 오버로드의 예시

   · 파라미터의 데이터형이 서로 다르기 때문에 오버로드 성립

    	public void user(int a){...}
	    public void user(String a){...}

   · 파라미터의 개수가 서로 다르기 때문에 오버로드 성립

		public void user(int a){...}
		public void user(int a, int b){...}

   · 데이터형의 전달 순서가 서로 다르기 때문에 오버로드 성립

		public void user(int a, String b){...}
		public void user(String a, int b){...}

   · 오버로드 성립되지 않음

		public void user(int a){...}
		public void user(int b){...}

1-2. 생성자의 오버로드

  • 생성자 역시 메서드의 한 종류이므로 Overload가 가능

  • 생성자를 Overload 할 경우, 해당 클래스에 대해 객체를 생성하는 방법을 다양하게 준비할 수 있게 된다

1-3. this 키워드를 사용한 생성자 오버로드

  • this 키워드의 용법

 📎 메서드처럼 사용할 경우, 현재 클래스의 다른 생성자를 의미한다

  • this 키워드를 사용하여 생성자 Overload를 간결하게 처리하기

 📎 파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록 하여 데이터의 초기화를 한 곳에서 일괄적으로 처리하도록 구현할 수 있다

0개의 댓글