본문 바로가기

국비과정/JAVA

20230616 _[11일차]_01. 메소드 오버로딩 & 생성자

이름이 같아도 파라미터의 수, 순서, 타입이 다르면 다른 메소드로 인지
다른 메소드로 인지 = 메소드 오버로딩

 

[ 메소드 오버로딩(overloading) ]

 

같은 이름의 메소드를 중복하여 정의하는 것을 의미합니다.

자바에서는 원래 한 클래스 내에 같은 이름의 메소드를 둘 이상 가질 수 없습니다.

하지만 매개변수의 개수나 타입을 다르게 하면, 하나의 이름으로 메소드를 작성할 수 있습니다.

 

 

면접에서 많이 물어봄!!

1. 오버로드 / 오버로딩 = 같은 이름의 메소드, 메소드 시그니쳐

= 한 클래스 내에서는 같은 이름의 메소드가 있으면 안됨.

= 파라미터가 다르면 같은 이름으로 메소드명을 만들 수 있음

= 파라미터의 갯수, 순서, 타입이 다르면 다른 메소드

= 메소드 호출할 때 파라미터로 구분해서 호출합니다.

 

2. 오버라이드 / 오버라이딩 = (상속, 부모자식관계) _________책 p.310

= 상위(부모) 클래스에 있는 메소드와 동일한 메소드를

= 하위(자식) 클래스에서 재정의 해서 사용하는 것.

 

3. 인터페이스 아는지_________책 p.370

= 자바는 다중 상속이 불가능 -> 이를 극복하기 위해 나옴

= 인터페이스는 스스로 객체를 생성하지 못함. 상속용도로 사용하기 위함.

= 인터페이스는 미구현 메소드(바디가 없음)로 구성됨

?? 인터페이스 <-> 클래스


 

[ 메소드 오버로딩 ]  _ 메소드에만 적용 (변수나 클래스는 불가능)

 

package human;

public class Human {
	// 같은 이름인 add 메소드 여러개 생성 가능!
    
	public void add(int num1, int num2) {

	}			 

	public void add(int num1, int num2, int num3) {
		
	}
	
	public void add(long num1, int num2) {

	}

	
	public static void main(String[] args) {


	}

}

( 1. 파라미터의 갯수가 다르면 가능 ) _ 다른 메소드로 인식

	public void add(int num1, int num2) {

	}

	public void add(int num1, int num2, int num3) {
		
	}

 

( 2.  파라미터의 데이터타입이 다르면 가능 )

	public void add(int num1, int num2) {

	}

	public void add(long num1, int num2) {

	}

 

( 3.  파라미터의 데이터타입의 순서가 다르면 가능 )

	public void add(int num1, long num2) {

	}
	
	public void add(long num1, int num2) {

	}

 

 ex) .println()     --> 모든 종류의 데이터타입 출력가능
이미 만들어져 있는 여러가지의 print() 메소드들 중에서 각 데이터 타입에 해당하는 메소드를 가져와 사용한것. 

		System.out.println(100);
		System.out.println(100L);
		System.out.println(true);
		System.out.println("출력");

실제로 int, long, array, string, boolean 등의 값을 출력해보고 속성 들어가보면
public void println(int x) {~~
public void println(long x) { ~~
...
만들어져 있음!


[ 생성자 ]

 

 

 

[ 기본생성자 ]

 

package human;

public class Human {
	
	public void add(int num1, int num2) {
		int result = num1 + num2;	// 지역변수 result는 add()실행이 끝나면 삭제됨.
		System.out.println(result);
	}	

	
	
	public static void main(String[] args) {

//		생성자 : 생성자도 메소드 : 객체의 초기화 담당
		Human h = new Human();  // --> 기본생성자 (클래스명과 동일)
		h.add(10, 20);	// 30

		
	}
}

[ 생성자 선언 ]

package human;

public class Human {
	
	// 생성자 (클래스명과 동일)
	public Human(String n) {	// 객체 생성용도로만 사용!!!! 메서드랑 다름

	}
	
	public Human(int a) {

	}
	
	public Human(int a, String n) {

	}

	public static void main(String[] args) {

		Human h = new Human("홍길동");	// 생성자 호출해서 객체생성 (데이터타입 맞춰줘야함*)
		Human h1 = new Human(30);
		Human h2 = new Human(30, "홍길동");	
	
	}

}

 

( 매개변수 여러개인 경우 )_ 연산메소드

package human;

public class Human {
	
	public void add(int... i) {	 // 파라미터가 무한개 입력되었다면
		int result = 0;
		for (int j = 0; j < i.length; j++) {
			result += i[j];
		}
		System.out.println(result);
	}
	
	
	public static void main(String[] args) {

		Human h = new Human();
		h.add(1, 2, 3, 4, 5);	// 15
        h.add(1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1); // 11
		
	}

}

* public void add ( int... i -- > 모든 i의 값을 받아오겠다는 의미


(참고) _ 자주하는 실수

if(true) {
	System.out.println("!");
} {
	System.out.println("W??");
}

//	!
//	W??

* 둘다출력됨!!! 괄호주의