
오늘의 띠용
인터페이스형 인스턴스 변수를 통해 인스턴스를 생성 할때 오버로딩을 한 메서드는 어떻게 될까?\
다형성
일반적으로 인스턴스의 변수를 만들 때는 2가지의 방법이 있다.
1. 인스턴스로 만들고자 하는 클래스 형으로 변수를 지정하기
2. 다형성을 이용하기
public class TestImplementsNOverloading {
public static void main(String[] args) {
TestClass test = new TestClass();
TestClass02 test2 = new TestClass02();
Test Test test3 = new TestClass();
Test Test test4 = new TestClass02();
}
}
interface Test {
public void testIF(int num);
}
class TestClass implements Test{
@Override
public void testIF(int num) {
System.out.println("입력 받은 번호는 "+num);
}
public void testIF(){
System.out.println("안녕하세요 테스트 문구입니다.");
}
}
class TestClass02 implements Test{
@Override
public void testIF(int num) {
System.out.println("입력 받은 번호는 "+num);
}
public void testIF(){
System.out.println("안녕하세요 테스트 문구입니다.");
}
}
1. 클래스형 변수를 이용하기
위와 같은 코드가 있다고하자.
나는 인스턴스를 생성하고 저장하기 위해 인스턴스 변수 test / test2를 만들었다.
각각의 변수의 데이터 타입은 Testclass / TestClass02 이다.
위의 인스턴스들은 하는일이 똑같다.
또한 인터페이스 Test를 구현하고 있다.
그렇다면 이 것을 한번에 관리 할 수 없을까???? 라는 생각을 할 수 있다.
그러나 저 코드들이 10000000000줄이라고 가정을 해보자.
이 때 저런 코드들을 하나하나 관리한다면 분명 관리를 하는 중에 문제가 생길 것이고 코드를 이쁘게 짜고 싶은 생각이 들것이다.
예를 들어 아 저런 인스턴스들을 배열에 넣을 수 없을까?? 같이
나는 다형성의 시작이 여기서 왔다고 생각한다.
유사한 기능을 수행하는 것들을 한번에 관리 할 수는 없는가?
이게 다형성의 시작이라고 생각한다.
2. 다형성을 활용하기
위의 코드에서 test3 /test4 를 보자
1번의 방식이 아니라 인터페이스를 이용해서 데이터의 타입을 정해줬다.
저 변수들을 보면 첫 번째로 무슨 생각이 드는가?
나는 아 저건 배열에다 넣어서 관리가 가능하겠네?? 라는 생각이 들었다.
저런 방식이 왜 가능한 것인가?
TestClass / TestClass02 는 모두 Test라는 인터페이스를 구현하고 있기 때문이다.
즉 위의 두 클래스는 서로 공통된 부분이 있고 그걸 인터페이스로 정의해뒀다 라고생각하면 이해하기가 쉬울 것 같다.
즉 공통된 성질을 데이터 타입으로 설정하고 각각의 인스턴스를 해당 변수에 저장한 것이다.
나는 지금 공통된 성질이라고 했다.
클래스에서 공통된 성질이라 함은 무엇이겠는가?? 메소드가 있다.
자! 그럼 인터페이스를 데이터 타입으로 변수를 지정했을 때 각각의 클래스의 모든 내용을 사용할 수 있는가????
NO!
절대 그렇지 않다.
나는 방금 공통된 부분으로 묶은 인터페이스 자료형으로 변수를 선언했다고했다.
그렇다는 것은 일단 이 변수가 사용할 수 있는 것은 인터페이스에 정의가 되어있는 것이어야한다는 것을 의미한다.
그럼 어떻게 서로 다른 메서드들을 이용해요?? 라는 생각이 들 수있다.
간단하다. 강제 형변환 혹은 명시적 형변환을 통해 원래의 데이터 타입으로 변경해주고 사용하면 해결이 가능하다.
여튼 다형성을 활용해서 인스턴스를 만드는 것을 알아 보았다.
이제 본격적인 질문! 오버로딩
오버로딩은 간단하게 메서드의 이름이 같고 매개변수의 유형과 수가 다른 메서드들을 만드는 것이다.
나는 오버로딩된 것들도 처음 만들어진 메서드를 상속받는 느낌??? 이라는 생각으로 생각해왔었다. 물론 의미는 다르지만 원본이 있으면 이를 따와서 만들었다? 정도로 생각했다.
그렇기에 인터페이스형으로 인스턴스를 만들 때 오버로딩 된 메서드를 부를 수 있을까? 라는 궁금증이 생겼다.
결과!!
NO!
절대 불가능하다.
데이터타입을 인터페이스로 하면 해당 변수를 사용하기 위해 일단 데이터타입을 확인한다.
데이터 타입을 확인했을 때 쭉~~~~~어 ! 해당 메서드가 없네 !! 하고 에러를 던진다.
이를 통해 나는 2가지를 알 수 있었다.
1. 오버라이딩 된 것은 인터페이스에 정의 되어있지 않기 때문에 사용하고자 한다면 명시적 형변환이 필요하다!
2. 오버라이딩 된것들은 별도의 메서드라고 봐야하는 구나! 다만 JAVA에서 편의성을 제공하는 것이구나! 라는 것으로 이해했다.
소감
무엇인가를 배울때 왜 이게 가능한가? 라는 것들을 항상 생각하며 학습을 하고있다.
그렇기에 학습하는 속도가 더디고 느려지지만 항상 어 이런게 가능하네?? 라는 생각을 할 수 있다.
항상 학습을 하며 느끼는 게 있다.
java 뿐만 아니라 모든 프로그래밍 언어들을 사람들의 귀찮음 혹은 불편함을 해소하기 위해 / 좀 더 효율적인 코딩을 제공하기 위해 발전해 나갔다고 생각한다.
그렇기에 생각보다 합리적이고 편리한 언어다 라는 것이다.
오늘도 좋은 개발자가 되기 위해 0.1 발자국은 전진한 느낌이다.
개발자가 되기위한 모든 준비생들 및 개발자 여러분들에 대한 존경과 JAVA 라는 언어를 만든 개발자분들에 대한 존경이 뿜뿜 생기는 날이다.
'이전 학습 내용' 카테고리의 다른 글
| Why Use Spring? (0) | 2022.12.06 |
|---|---|
| Framework (0) | 2022.12.06 |
| 띠용~~~ 같은 클래스의 메서드에 값을 전달 하는방법 (2) | 2022.12.04 |
| 오늘의 띠용@!@(네스트 클래스 테스트) (0) | 2022.12.02 |
| NPE (0) | 2022.11.29 |