-
[JAVA] #오버로딩/오버라이딩프로그래밍/JAVA 2022. 6. 15. 20:29728x90반응형
요즘 자바 공부를 엄청 많이 했다고 스스로 느꼈지만, 정리를 할시간이 많이 없었다.. 개인적인 사정으로 이리저리 굴려지느라 블로그 작성에 많이 소훌해 진것 같다.. 이제 마음을 바로 잡고 다시 작성을 해보자
일단 이정도 됐으면, 헷갈려하는 사람이 아무도 없는데 다 헷갈려 한다고 말하는 오버로딩과 오버라이딩이다. (이것은 내가 그냥 정리를 하고 싶어서 개인적으로 올리는것이므로 삐지지 말도록 하자.)
먼.저.오버로딩(Overloading)
정의 : 매개변수의 선언형태(타입,개수)가 다르면 동일한 이름의 메서드를 정의 가능
일단 오버로딩이라는 개념 자체가 자바 이외에도 객체지향에서 모두 지원하는 중요한 문법적 요소라고 생각한다.
항상 예제 코드를 작성할 때는 우리가 잘 모르지만 프로젝트를 진행하여 엄청난 양에 코드를 작성한다고 하면, 여러 맴버들의 이름을 짓는 것이 엄청난 고통을 준다.. 그래서 우리는 같은 동작을 하나 그 기능의 차이를 주고 싶을 때 오버로딩이라는 것을 사용하게 된다.
긴말은 필요없으니 코드로 보여주겠다.class HighSchool{ int grade; String major = null; HighSchool(int grade){ this.grade = grade; //학년 저장 this.major = null; //학과가 없음으로 NULL값 저장 } HighSchool(int grade,String major){ this.grade = grade; //학년 저장 this.major = major; //학과 저장 } void showStudentInfo(){ if(grade<4&&grade>0){ //1~3학년일 경우 System.out.print(grade+"학년 "); if (major != null&& grade !=1) //전공이 존재하거나 1학년이 아닐경우 System.out.println(major +"전공"); else //1학년일 모든 경우 System.out.println("전공없음"); } else System.out.print("누..누구세요..?"); } } public class overloading { public static void main(String[] args) { HighSchool junior = new HighSchool(1); HighSchool senior = new HighSchool(2,"심심한데 우리 뽀뽀나 할과"); junior.showStudentInfo(); senior.showStudentInfo(); } }
이부분에서 우리가 봐야한 부분은 아래와 같은 부분이다.HighSchool(int grade){} HighSchool(int grade,String major){}HighSchool 메서드라는 동일한 이름의 메서드를 두개 생성하였다.이렇게 생성할 수 있는 이유는 아까 설명했듯이 선언형태가 다르기 때문이다. 그 선언형태라는 것은 매개변수의 타입과 개수 두가지를 말하는 것이다.
예시)void HighSchool(int grade){} //메서드 선언 void HighSchool(int grade,String major){} //매개변수 개수를 다르게 선언 void HighSchool(int grade,int major){} //매개변수 개수는 같지만 타입을 달리하여 선언 int HighSchool(int grade,int major){} //리턴타입은 영향을 주지 않으므로 오버로딩 실패하지만 이런 경우가 존재 할 수 있다.
class HighSchool{ HighSchool(int grade,int major){} HighSchool(int grade,long major){} } public class overloading { public static void main(String[] args) { HighSchool junior = new HighSchool(1,2); } }이렇게 작성할 경우 "둘중에 어떤 메서드를 불러오지..?" 이런 고민에 빠질수가 있다.
결론부터 얘기하자면,HighSchool(int grade,int major){}이 코드가 호출이 된다. 이유는 가장 가까운 위치에 놓여있는 자료형으로 변환이 이루어지기 때문이다.
그말은 즉슨, 우리가 호출하고 싶은 메서드를 호출할 수 없다는 뜻이다. 물론 이렇게 작성할 이유는 당연히 없어야 겠지만, 이런 일을 대비해서 해결척은 언제나 존재한다. 다음 코드를 보자class HighSchool{ HighSchool(int grade,int major){} HighSchool(int grade,long major){} } public class overloading { public static void main(String[] args) { HighSchool junior = new HighSchool(1,2); HighSchool junior = new HighSchool(1,2L); } }생성자 호출시 특정 자료형의 형태를 맞춰주면 된다. long은 뒤에 대문자L을 붙이면 된다. Int형은 기본 자료형이기에 생략을 해도 되지만 나머지는 이렇게 구분을 해줘야한다.
오버라이딩(Overiding)
정의 : 부모클래스의 메서드를 자식 클래스에서 변경하거나 재정의 하는 것
애초에 오버로딩과 오버라이딩은 이름만 비슷하고 완전히 다른 개념이다.(사실 나는 아직까지 헷갈린적은 없다..)
이것도 말은 말보다 코드다.class Dog{ String dog(){ return "강아지"; } } class Maltese extends Dog{ String dog(){ return "말티즈"; } } class Bichon extends Dog{ String dog(){ return "비숑"; } } public class OverRiding { public static void main(String[] args) { Dog d = new Dog(); Maltese m = new Maltese(); Bichon b = new Bichon(); System.out.println(d.dog()); System.out.println(m.dog()); System.out.println(b.dog()); } }Maltese클래스와 Bichon클래스 모두 Dog클래스를 상속 받고 있다. 그리고 세 클래스 모두 dog로 메서드 이름이 동일 하다. 하지만 반환값이 모두 다르다. 이렇게 변경하거나 재정의 하여 우리가 원하는 맛대로 코드를 작성할 수 있다.
오버라이딩의 조건- 정의하는 메서드의 선언부가 부모클래스의 메서드의 선언부와 일치해야만 한다.
- 자식클래스 맴버의 접근제어자를 조상클래스의 맴버보다 적은 번위로 변경할 수 없다.
- 자식메서드의 예외는 조상메서드보다 많이 선언할 수 없다
class Dog { public String dog() throws IOException{ return "강아지"; } } class Maltese extends Dog{ protected String dog()throws IOException, ArithmeticException{ //선언형태가 일치해야한다. //자식의 예외가 많을 수 없다. //자식의 접근제어자의 범위가 좁을 수 없다. return "말티즈"; } }위와 같은 예제로 한번에 설명 할 수 있다.
먼저 메서드의 이름,매개변수 타입,개수모두 일치해야함으로 선언 형태에는 문제가 없고,
자식은 trows가 부모보다 1개 더 했기 때문에 문제가 되고,
자식의 접근 제어의 범위는 public이나 자식은 protected이기 때문에 문제가 된다.
위의 말을 숙지하지 않고 코드작성할 때 오버라이딩을 시도 했다가 몰매를 맞은적이 있다. 저 주의사항을 항상 숙지하자.오버로딩(Overloading)과 오버라이딩(Overiding)의 차이
자 두 개념을 모두 알아보았다. 우리도 이제 확실하게 알아보았으니 이제 둘의 차이점을 한번 파악해보자. 하지만 그 전에 생각이 든다. 둘이 완전 다른 개념이라고 했는데 얼핏 보면 둘다 공통점이 존재한다. 한번 정리해 보자.
공통점- 메서드의 이름이 동일해야한다.
- 비슷한 일을 하는 메서드를 여러개 만들어야할 경우에 사용된다.
나는 거의 개와 늑대의 차이라고 본다. 하지만 둘다 코드작성의 능률을 높여주는 역할이고 우리가 알면 도움이 되는 개념들이니 정리를 해본것이더 이제 차이점을 살펴보자
차이점- 오버로딩은 매개변수 선언형태가 달라야하지만 오버라이딩은 같이야한다.
- 오버로딩은 메서드의 반환형태의 영향을 받지 않지만 오버라이딩은 같아야한다.
- 오버로딩은 클래스 내부에서 벌어지지만 오버라이딩은 상속관계의 클래스끼리 벌어진다.(상속개념 유무)
- 오버로딩은 모든 접근제어자를 사용할 수 있지만 오버라이딩은 자식이 부모보다 접근제어자의 범위가 좁을 수 없다.
솔직히 말하면 메서드 이름동일 이라는거 외에는 아무런 공통점이 없다.. 이 개념을 많이 어려워하는 코린이 여러분들에게 도움이 되었으면 하는 마음반, 내가 공부한것 정리반으로 작성해보았다.
작성이 끝났으니 다음 공부를 하러 가기 위해 포스팅을 마친다. 바이바이~'프로그래밍 > JAVA' 카테고리의 다른 글
[JAVA] #생성자 (0) 2022.06.01