2021.11.11 TIL

서승원·2021년 11월 11일
0

TIL

목록 보기
17/68

2021.11.11 TIL
상속
상속은 한 class B가 다른 class A에게 변수와 함수를 옮겨받아 class 정의가 내려지는 것이다. 이 때 B를 자손클래스, A를 조상클래스라고 하며, 상속받은 내용은 A,B 모두에서 호출 가능하고 B에 새로 입력한 내용은 B에서 호출이 가능해진다.

상속을 받아 정의된 두 class이다. B에서 data의 값과 print 함수의 동작을 약간 수정했다. 두 인스턴스를 호출해 t , t2 두 참조형변수에 각각 대입한다.
위와 같이 조상클래스로부터 옮겨받은 함수를 재정의하는 것을 Method Overriding 이라고 한다.


오버라이딩을 포함해, 새로운 함수도 B에 정의해준 뒤 A t = new B(); 라는 코드를 입력했다. A클래스를 인스턴스로 가리킬 수 있는 t 참조형변수를 B인스턴스를 가리키게 했다. 그리고 B t2 = (B)t; 로, t를 B클래스로 강제형변환 하게해 t2 에 대입한다. 이렇게하면 실제로는 아니지만 기능상으로 그림과 같이 된다. t에서 함수를 호출하면 오버라이딩된 함수는 오버라이딩 한 결과 그대로 출력되지만 새로 입력된 함수인 print2 는 호출이 불가능해 진다.
그렇다면, 이런 경우 멤버변수도 오버라이딩 할 수 있을까 ?

멤버 변수를 오버라이딩하면 컴파일 에러도 발생하지않고 출력도 된다. 하지만 이 경우의 문제점은 접점이 있는 두 인스턴스 간 변수명이 같고 값이 다른 변수가 생기면 코딩 시 큰 혼란을 야기하게 된다. 조상변수와 자손변수간은 변수명이 같은 변수의 선언을 꼭 피해야한다.

매개변수

함수명이 같고, 매개변수의 형태가 다른 함수를 입력했을 때의 결과다. 이 경우는 입력된 코드의 매개변수 값에 따라 호출되는 함수가 결정된다. 위의 경우 우선순위를 매겨보면, int i 로 완벽히 자료형이 일치하는 3번째 print 함수가 1위이다.
그렇다면 2번째는 어떤 함수일까? 정답은 1번째 double i 매개변수를 입력받는 함수다. 왜냐하면 매개변수가 일치하지 않지만 자동형변환이 가능한 경우, 서열상 가까운 자료형으로 우선적으로 변환되게 돼있다. 그래서 float 보다 int 자료형과 서열상 가까운 double i 로 형변환이 되는 것이다.

위의 경우처럼 매개변수가 다르고 이름이 같은 함수가 공존하는 것을 Method Overloading 이라고 한다. 오버라이딩과 마찬가지로 멤버변수의 오버로딩 개념은 없고, 이렇게 매개변수에 따라 여러 함수가 정의되는 것은 기본 java의 경우에도 여러 함수가 존재한다. indexOf 의 경우도 매개변수의 자료형으로 int,String 등, 입력되는 입력변수에따라 1개,2개, 그 이상 수많은 매개변수 조합으로 여러 함수가 구성돼있다.

profile
2년차 백엔드 개발자, crimy

0개의 댓글