Overload

치로·2024년 7월 19일

메서드 오버로드(Overload)

1. 메서드 오버로드란?

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

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

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

3. 메서드 오버로드 예시

  • 파라미터의 데이터형이 서로 다르기 떄문에 오버로드 성립
    public void plus(int a) {}
    public void plus(boolean a) {}
  • 파라미터의 개수가 서로 다르기 떄문에 오버로드 성립
    public void user(int a) {}
    public void user(int a, int b) {}
  • 데이터형의 전달 순서가 서로 다르기 때문에 오버로드 성립
    public void user(int a, boolean b) {}
    public void user(boolean a, int b) {}
  • 오버로드 성립 불가
    public void user(int a) {}
    public void user(int b) {}

4. 오버로드 사용 이유

  • 오버로드는 하나의 메서드를 호출할 수 있는 모든 경우의 수를 미리 준비해 놓음으로서,
    메서드를 만드는 측은 번거로울 수 있지만 메서드를 호출하는 측은 데이터 타입을 신경 쓰지 않고 편리하게 사용할 수 있음

5. 객체 생성 방법의 다양화

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

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

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

예시 코드

package overload;

public class Character {
	private String job;
	private int age;
	
	public void setProperty(String job) {
		this.job = job;
		
	}
	
	public void setProperty(int age) {
		this.age = age;
	}
	
	public void setProperty(String job, int age) {
		this.job = job;
		this.age = age;
	}
	
	public void setProperty(int age, String job) {
		this.age = age;
		this.job = job;
	}

	@Override // source - generate - generate toString 누르기
	public String toString() {
		return "Character [job=" + job + ", age=" + age + "]";
	}
}
package overload;

public class Main01 {

	public static void main(String[] args) {
		Character c = new Character();
		System.out.println(c.toString());
		
		c.setProperty(30);
		System.out.println(c.toString());
		
		c.setProperty("개발자");
		System.out.println(c.toString());
		
		c.setProperty(20, "자영업자");
		System.out.println(c.toString());
		
		c.setProperty("교수", 40);
		System.out.println(c.toString());
	}

}
package overload;

public class Member {
	private String job;
	private int age;
	
	public Member() {}
	public Member(int age) {
		this.age = age;
	}
	public Member(String job) {
		this.job = job;
	}
	public Member(String job, int age) {
		this.job = job;
		this.age = age;
	}
	
	@Override
	public String toString() {
		return "Member [job=" + job + ", age=" + age + "]";
	}
}
package overload;

public class Main02 {

	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("개발자", 30);
		System.out.println(m4.toString());
	}

}
package 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, "제목 없음", "익명");
//		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 + "]";
	}
	
}
package overload;

public class Main03 {

	public static void main(String[] args) {
		Article a1 = new Article(1);
		System.out.println(a1.toString());

		Article a2 = new Article(2, "자바 질문1");
		System.out.println(a2.toString());
		
		Article a3 = new Article(3, "게시물 작성", "자바 학생");
		System.out.println(a3.toString());
	}

}

0개의 댓글