yeahzzz
archive
yeahzzz
전체 방문자
오늘
어제
  • 분류 전체보기 (164)
    • Language (41)
      • Python (12)
      • JAVA (21)
      • C&C++ (8)
    • Algorithms (25)
      • programmers (9)
      • study log (16)
    • Problems & Solutions (14)
    • Major (29)
      • Data Structure & Algorithm (14)
      • Linux(Ubuntu) (9)
      • Security (2)
      • Linear Algebra (4)
    • FE (44)
      • Web(HTML5, CSS, JS) (5)
      • React & TS (26)
      • 코딩일기 (10)
    • BE (1)
      • Node.js (1)
    • Pytorch (8)
    • Server (2)

블로그 메뉴

  • 홈

공지사항

인기 글

태그

최근 댓글

최근 글

티스토리

hELLO · Designed By 정상우.
yeahzzz

archive

다형성(오버라이드,오버로드)/객체 형변환/암묵적 형변환
Language/JAVA

다형성(오버라이드,오버로드)/객체 형변환/암묵적 형변환

2021. 8. 8. 14:18

다형성 - 오버라이드(Override)

육군,해군,공군은 Unit이라는 클래스를 통하여 공통 속성을 정의하고 있다

공통속성 -> 이름(멤버변수 및 getter,setter), 공격(attack()메서드)

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

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

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

 

재정의된 메서드의 흐름(2.Override 참조)

e.say(); : 자식클래스에 구현된 메서드가 없기 때문에, 부모 클래스에 정의된 메서드를 찾아가게 됨

k.say(); : 자식클래스가 부모와 같은 이름의 메서드를 정의하고 있기때문에 k 객체에게는 부모클래스가 정의하고 있는 say() 메서드가 가려지게 됨

 

Super

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

멤버변수 이름앞에 명시. : 부모클래스의 멤버변수를 의미

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

메서드 이름 앞에 명시 : 부모클래스의 메서드를 의미

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

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

 

키워드 자체를 메서드처럼 사용 : 부모클래스의 생성자를 의미.

 

상속을 통한 메서드의 기능 확장 처리

super(2/4)참고 

Hello 클래스가 Korean에 상속되고, Korean 클래스가 say()메서드를 Override 처리하게 되면

Korean 클래스의 객체는 더이상 부모의 say() 메서드에 접근할 수 없게 됨.

 

만약 부모클래스가 갖고있는 say()메서드에 추가적인 기능을 구현하고자 한다면

코드를 그대로 복사해서 사용해야 할 것.

원본 기능에 대한 수정이 발생할 경우 부모 클래스와 자식클래스를 모두 수정해야하기 때문에 소스코드의 유지보수 효율성이 감소

 

super 키워드는 부모 클래스의 메서드를 호출하는 기능을 가지고있기때문에 Override된 자식의 메서드에서 이 키워드를 사용하면

재정의 되기 이전의 부모클래스에 대한 메서드를 호출할 수 있음 

super 키워드를 사용하여 부모의 메서드를 호출한 뒤에 추가적인 기능을 정의,

부모의 원본 메서드에 대한 기능확장 효과 ㅇ 

 

다형성 - 오버로드(Overload)

- 메서드 오버로드 

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

 

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

메서드 간에 파라미터가 서로 달라야 함 : 파라미터의 데이터 타입이 다름. 

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

-> 파라미터의 개수가 다름

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

리턴형이 다른 경우는 오버로드 성립에 영향 ㄴㄴ 

 

오버로드의 예시

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

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

 

그렇다면 오버로드를 왜 사용?

하나의 메서드를 호출할 수 있는 모든 경우의 수를 미리 준비해놓음으로서 메서드를 만드는 측은 번거로울 수 있지만

메서드를 호출하는 측은 데이터 타입을 신경쓰지 않고 편리하게 사용할 수 있어서 

 

Overload

 

객체 생성 방법의 다양화

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

생성자를 오버로드 할 경우 , 해당 클래스에 대해 객체를 생성하는 법을 다양하게 준비할 수 있음

 

               

this 키워드를 사용한 생성자 오버로드

this 키워드의 용법 

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

 

this 키워드를 사용하여 생성자 오버로드를 간결하게 처리

: 파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록 하여

데이터의 초기화를 한 곳에서 일괄적으로 처리하도록 구현 

 

객체 형변환

자바 기본 유형의 데이터들처럼 객체 참조변수의 경우에도 형변환(캐스팅)이 이루어짐

서로 다른 클래스 유형으로부터 나온 객체 참조변수들간의 대입에는 일정한 규칙이 존재 

* 같은 부모 클래스에서 파생된 서로 다른 자식 클래스의 객체들은 부모 형태로 암묵적 형변환이 되어 일관된 형식으로 사용 가능. 

 

Parents parents = new Child();

 

위의 대입연산에서 왼쪽 항과 오른쪽 항의 객체 유형이 서로 다른 경우 , 두 유형이 서로 상속관계에 있음

왼쪽 객체 (Parents) 가 오른쪽 객체의 상위클래스인 경우에만 암묵적인 형 변환이 일어남. 

 

하위 클래스-> 상위 클래스 : 할당 가능

상위 클래스 -> 하위 클래스 : 명시적 형 변환을 해야함 

 

*객체 간의 암묵적 형변환

 A a1 = new B();

 

암묵적 형변환과 메소드 오버라이드

암묵적 형변환 : 부모를 상속받는 자식객체의 기능을 부모에게 물려받은 기능만 사용하도록 제한

: 오버라이드 된 기능만 사용가능 / 구현한 기능은 사용 불가. 

* 기능의 제한(O) , 기능의 변경(X)

상속관계의 객체를 부모 형태로 변환하면 클래스의 종류를 구분하지 않고 일관된 기능 호출 가능

추가적으로 구현한 기능은 사용할 수 없게 됨... 그래서 원래의 기능을 다시 사용할 수 있는 방법 필요

 

명시적 형변환

부모클래스의 객체를 자식 클래스 형태로 변환 

변환할 클래스 이름을 명시적으로 지정 필요

 

*조건 필요  

객체가 최초로 생성될 때 자식 클래스 형태로 생성ㅇㅇ -> 부모의 형태로 암묵적 형변환이 된 상태를 다시 원래의 자식 클래스 형태로 되돌릴 경우에만 가능함. 

 

'Language > JAVA' 카테고리의 다른 글

Constructor & Overloading  (0) 2021.09.28
객체 배열 / 추상화  (0) 2021.08.31
클래스, getter그리고setter, 접근한정자  (0) 2021.08.01
Constructor  (0) 2021.07.29
JAVA Inheritance  (0) 2021.07.28
    'Language/JAVA' 카테고리의 다른 글
    • Constructor & Overloading
    • 객체 배열 / 추상화
    • 클래스, getter그리고setter, 접근한정자
    • Constructor
    yeahzzz
    yeahzzz

    티스토리툴바