[Java] 오버로드 & 오버라이드 (Overload & Override)

hyun-jin·2022년 9월 28일
0

Java

목록 보기
13/14

1. 오버로드(Overload)

  • 원칙적으로 하나의 클래스 안에는 동일한 이름의 메소드가 두개 이상 존재할 수 없지만, 이를 가능하게 하는 예외적인 처리 기법이다.
  • 같은 함수명이지만 매개변수의 개수가 다르거나 자료형(type)이 다른 경우 다른 함수로 인식하게 하는것이다.

1-1. 이름이 동일한 메소드를 정의하기 위한 조건

  • 메소드 간의 파라미터가 서로 달라야한다.
    1) 파라미터의 데이터 타입이 다르다.(데이터 형이 동일하고 변수의 이름이 다른경우는 동일한 파라미터로 인식된다.)
    2) 파라미터의 개수가 다르다.
    3) 서로 다른 데이터형을 갖는 파라미터들의 전달 순서가 다르다.
  • 리턴형이 다른 경우는 오버로드의 성립에 아무런 영향을 주지 않는다.

1-2. 오버로드 예시

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

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

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

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

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

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

  • 오버로드 성립 불가

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

1-3. 생성자의 Overload

  • 객체 생성 방법의 다양화
  • 생성자 역시 메소드의 한 종류이므로 Overload가 가능하다.
  • 생성자를 Overload 할 경우, 해당 클래스에 대해 '객체를 생성하는 방법'을 다양하게 준비할 수 있게 된다.

예)

public class Member { 
	private String job;
	private int age; 
    // 파라미터가 없는 경우
	public Member() {		
	}	
    // 파라미터 1개(age)
	public Member(int age) {
		this.age = age;
	}	
    // 파라미터 1개(job)
	public Member(String job) {
		this.job = job;
	}	
    // 파라미터 2개(job, age)
	public Member(String job, int age) {
		this.job = job;
		this.age = age;
	}
	@Override
	public String toString() {
		return "Member [job=" + job + ", age=" + age + "]";
	}
}

-> 객체호출)

public class Main03 {
	public static void main(String[] args) {
    	// 파라미터 없음
		Member m1 = new Member();
		System.out.println(m1.toString());
		// 파라미터 숫자 입력
		Member m2 = new Member(19);
		System.out.println(m2.toString());
		// 파라미터 문자 입력
		Member m3 = new Member("학생");
		System.out.println(m3.toString());
		// 파라미터 문자, 숫자 입력
		Member m4 = new Member("개발자", 20);
		System.out.println(m4.toString());
	}
}

-> 결과)

Member [job=null, age=0]
Member [job=null, age=19]
Member [job=학생, age=0]
Member [job=개발자, age=20]

1-4. this 키워드를 사용한 생성자 Overload

  • 키워드의 용법
    -> 메소드처럼 사용할 경우, 현재 클래스의 다른 생성자를 의미한다.

  • this 키워드를 사용하여 생성자 Overload를 간결하게 처리한다.
    -> 파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록하여, 데이터의 초기화를 한 곳에서 일괄적으로 처리하도록 구현할 수 있다.

예)

public class Article {	
	private int seq;
	private String subject;
	private String writer;	
	public Article(int seq, String subject, String writer) {
		super();
		this.seq = seq;
		this.subject = subject;
		this.writer = writer;
	}	
	public Article(int seq) {
		// this.seq = seq;
		// this.subject = "제목없음";
		// this.writer = "익명";
		this(seq, "제목없음", "익명");
	}	
	public Article(int seq, String subject) {
		// this.seq = seq;
		// this.subject = subject;
		// this.writer = "익명";
		this(seq, subject, "익명");
	}	
	@Override
	public String toString() {
		return "Article [seq=" + seq + ", subject=" 
				+ subject + ", writer=" + writer + "]";
	}

-> 객체호출)

public class Main04 {
	public static void main(String[] args) {
    	// 파라미터 숫자만 입력
		Article a1 = new Article(1);
		System.out.println(a1.toString());		
        // 파라미터 숫자, 문자 하나씩 입력
		Article a2 = new Article(2, "테스트 게시물");
		System.out.println(a2.toString());		
        // 파라미터 숫자, 문자, 문자 입력
		Article a3 = new Article(3, "세번쨰 게시물", "자바학생");
		System.out.println(a3.toString());				
	}
}

-> 결과)

Article [seq=1, subject=제목없음, writer=익명]
Article [seq=2, subject=테스트 게시물, writer=익명]
Article [seq=3, subject=세번쨰 게시물, writer=자바학생]

2. 오버라이드(Override)

  • 부모클래스에서 정의한 메서드를 자식클래스에서 재정의 하는 것이다.
    -> 부모클래스의 메서드와 메서드 구성 요소 모두가 동일해야 한다.
    -> 메서드명, 매개변수, 리턴 타입이 모두 같아야 한다.

-> 예)

class Hello{
	public void say() {
		System.out.println("Hello");
	}
}
// 자식클래스
class Korean extends Hello {
	public void say() {	// korean 클래스에 의해 say()메소드가 Override된 경우
		System.out.println("안녕하세요");
	}
  }

2-1. 자식 클래스가 재정의한 경우

  • 부모 클래스에서 정의된 것과 동일한 이름을 갖는 메소드를 자식 클래스가 정의한 경우, 부모 클래스의 기능은 자식에게 가려진다.
  • super를 사용하면 재정의되기 전의 부모 클래스의 메소드를 불러올 수 있다.

-> 예)

class Hello{
	public void say() {
		System.out.println("Hello");
	}
}
// 자식클래스
class Korean extends Hello {
	public void say() {	// korean 클래스에 의해 say()메소드가 Override된 경우
		System.out.println("안녕하세요");
	}
	public void sayHello() {
		super.say();	// 부모클래스(Hello)의 say()
		this.say();		// 나 자신(korean)의 say()
	}
}

-> 객체호출)

public class Main01 {
	public static void main(String[] args) {
		Korean kor = new Korean();
		kor.sayHello();
		System.out.println("---------------------------");
		kor.say();		
	}
}

-> 결과)

Hello
안녕하세요
---------------------------
안녕하세요

3. 객체 형변환(암묵적 형변환)

3-1. 객체 형변환

  • java 기본 유형의 데이터들 처럼 객체 참조변수의 경우에도 형변화(casting)이 이루어 진다.
  • 서로 다른 클래스 유형으로부터 나온 객체 참조변수들 간의 대입에는 일정한 규칙이 있다.

Parent parent = new Child( );

  • 왼쪽 항(부모 클래스)과 오른쪽 항(자식 클래스)의 객체 유형이 서로 다른 경우, 두 유형이 서로 상속 관계에 있고 왼쪽 객체(부모 클래스)가 오른쪽 객체(자식클래스)의 상위 클래스인 경우에만 암묵적 형변환이 일어난다.
  • 하위 클래스에서 상위클래스 유형을로 할당하는 것은 가능하나 그 반대의 경우에는 명시적 형변환을 해야한다.
    -> 그러나 상위 클래스 유형을 하위 클래스 유형으로 강제 형 변환하는
    경우에는 할당되는 객체의 유형에 따라서 실행 오류가 발생할 수 있다.

0개의 댓글