다형성 (오버로드, Overloading)

전영덕·2023년 1월 30일
0

Java Study

목록 보기
20/36

1. 메서드 오버로드(Overload)

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

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

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

3. 오버로드의 예시

  • 파라미터의 데이터형이 서로 다르기 때문에 오버로드 성립
    public void foo(int a) {}
    public void foo(long a) {}
    ( int 타입이 우선시되나, 보통 이렇게 헷갈리게 코딩하지는 않음)

  • 파라미터의 갯수가 서로 다르기 때문에 오버로드 성립
    public void foo(int a) {}
    public void foo(int a, int b) {}

  • 데이터 형의 전달 순서가 서로 다르기 때문에 오버로드 성립
    public void foo(int a, String b) {}
    public void foo(String a, int b) {}

  • 오버로드 불가
    public int foo(int a) {}
    public String foo(int x) {}

4. 생성자의 오버로드

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

5. 오버로드를사용하는 이유

  • 내가 개발한 코드를 다른사람이 사용할 때, 각각의 변수타입마다 메서드를 기억할 필요없이 하나만알면 쓰도록함. 즉, 쓰는 사람이 쉽게 쓰라고 만든 기법.

6. this키워드를 사용한 생성자 overload

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

7. this키워드를 사용하여 생성자 overload를 간결하게 처리한다.

  • 파라미터가 서로 다른 생성자들이 하나의 완전한 생성자를 호출하도록 하여, 데이터의 초기화를 한 곳에서 일괄적으로 처리하도록 구현할 수 있다.
class Hello{
	public Hello(String msg){
		System.out.println(msg);
	}
	public Hello( ){
		this("Hello");
		System.out.println("Hello);
	}
	
public class Main01 {

	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());
	}

}
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;
	}
	
	//3개의 값을 모두 입력해야 Article 하나가 생성되는데 제목은 제목없음, 작가 익명으로 일단 만들고 싶은 경우에 대해 만들고싶다.
	public Article (int seq) {
		this(seq,"제목없음", "익명");//this라는 키워드가 메서드처럼 사용했다. 아래 3줄을 한 줄로 처리했다.
//		this.seq = seq;
//		this.subject = "제목없음";
//		this.writer = "익명";
	}
	
	//
	public Article(int seq, String subject) {
		this(seq, subject, "익명");
//		this.seq = seq;
//		this.subject = subject;
//		this.writer = "익명";
	}
	
	@Override
	public String toString() {
		return "Article [seq=" + seq + ", subject=" + subject + ", writer=" + writer + "]";
	}
}

0개의 댓글