Java - 기본기

19. 오버로딩, 생성자, 기본 생성자, 생성자 this(), 참조변수 this

TerianP 2021. 12. 9.
728x90

1. 오버로딩(overloading)

  • 한 클래스 안에 동일한 이름의 메서드를 여러 개 정의하는 것
  • 기본은 하나의 메서드 이름 - 한 클래스 ⇒ 1 : 1
  • 오버로딩하면 메서드 : 클래스 = N : 1
  • 오버로딩이 성립하기 위한 조건 3가지
    • 메서드 이름이 같아야 함
    • 매개 변수의 개수, 순서, 타입이 달라야 함
    • 반환 타입은 영향 X
- 메서드 중복 정의 : 똑같은 메서드를 2번 정의하는 것 => 오버로딩 X
int add(int a, int b) { return a+b }
int add(int x, int y) { return x+y }

- 오버 로딩
int add(long a, int b) { return a+b } => add(3, 3L)
int add(int x, long y) { return x+y } => add(4L, 4)
  • 오버로딩의 올바른 예 - 매개변수는 다르지만 같은 의미의 기능 수행
    • 즉, 오버 로딩이란 한 클래스 안에 동일한 이름의 메서드가 여러개 정의되어있는 것을 의미함.
public class Practice_26 {
	public static void main(String args[]) {
		MyMath mm = new MyMath();
		System.out.println(mm.add(3, 3));
		
		int[] a = {100, 200, 300};
		System.out.println(mm.add(a));
	}

}

class MyMath{
	int add(int a, int b) {
		System.out.print("int add(int a, int b) - ");
		return a+b;
	}
	
	long add(long a, long b) {
		System.out.print("long add(long a, long b) - ");
		return a+b;
	}
	
	int add(int[] a) {
		System.out.print("int add(int[] a) - "	);
		int result = 0;
		
		for(int i=0; i< a.length; i++) {
			result += a[i];
			
		}
		
		return result;
	}
}

 

2. 생성자 - constructor

반드시 존재하거나, 없다면 자동으로 생성되어 실행됨

  • 인스턴스가 생성될 때마다 호출되는 '인스턴스 초기화 메서드'
  • 여기서 인스턴스란 객체를 의미하며, 객체란 쉽게 이야기해서 IV 묶음 이라고 생각하면 된다.
  • iv(인스턴스 벨류) 의 초기화란 "iv 값 정의" 라고 생각하면 편하다.
  • 생성자는 IV 초기화를 편하게 하려고 만들어진 메서드
- IV 초기화
Time t = new Time(); => 생성자 호출
t.hour = 12;
t.minute = 34;
t.second = 56;


- 조금 변형 하자면 Time t = new Time(12, 34, 56); => 이것도 생성자
- 정확히는 매개 변수가 있는 생성자

 

2) 생성자 규칙

  • 생성자 이름 = 클래스 이름
  • return 리턴값이 없음 - void 안 붙임
  • 모든 클래스는 반드시 생성자를 가져야 한다 => 생성자에 관하여 따로 코드를 작성하여 정의하는게 아닌 경우, 자동으로 기본 생성자가 생성됨
class Time{ // 클래스 명 Time
	
	Time(int i, int j, int k) { // 매개 변수가 있는 생성자
		// TODO Auto-generated constructor stub : 인스턴스 생성 시 수행될 코드
        // 주로 인스턴스 변수의 초기화 코드를 적는다
		System.out.println(i + j + k);
	}
	
	Time(){ // 매개 변수가 없는 생성자 => 기본 생성자
		
	}

}

 

3) 기본 생성자 - default constructor

  • 매개 변수가 없는 생성자
  • 기본적으로는 개발자가 생성자를 추가해주어야 하나, 생성자가 하나도 없을 때는 컴파일러가 자동 추가
  • 제대로 공부하기 위해서는 컴파일러가 자동으로 만들어주는 기능에 의지하지말고, 직접 만들어주는게 훨씬 더 좋음
class Data_1{ // 생성자가 하나도 없음 -> 컴파일러가 기본 생성자를 자동으로 만들어줌
	int value;
}

class Data_2{ 
	// 생성자가 이미 존재 -> 컴파일러가 기본 생성자를 자동으로 생성 X -> 
	// 컴파일러 오류를 해결하기 위해서는 기본생성자를 만들어줘야함
	
	int value;
	
	Data_2(){} // 기본 생성자
	
	Data_2(int x){ // 매개 변수가 있는 생성자
		value = x;
		System.out.println(x);
	}
}

 

4) 매개변수가 있는 생성자

  • 매개 변수가 있는 생성자는 생성자에 매개변수를 넣어서 객체를 생성할 수 있도록 해준다.
    • 이렇게 함으로써 인스턴스 생성시 변수를 쉽게 초기화 할 수 있고, 결과적으로 코드가 간결해진다.
  • 매개변수 생성자의 실행 과정 : 참조변수 c 생성 -> new 연산자가 Car 객체 생성 -> 객체 초기화 && 생성자 호출 -> 각각 Blue, manual, 4 가 color, gearType, door 에 대입됨
public class Prcatice_26_2 {

	public static void main(String args[]) {
		// 생성자를 사용하지 않고 IV 초기화 하는 경우
		Car c = new Car();
		
		c.color = "White";
		c.gearType = "auto";
		c.door = 2;
		
		System.out.println(c.color +" | "+ c.gearType +" | "+ c.door);
		
		// 생성자를 사용하는 경우
		Car c1 = new Car("Blue", "manual", 4);
		System.out.println(c1.color + " | " + c1.gearType + " | "+ c1.door);
	}
}

class Car{
	// IV : 인스턴스 변수
	String color; // 색상
	String gearType; // 변속기 종류 - auto(자동), manual(수동)
	int door; // 문의 개수
	
	Car(){};
	Car(String c, String g, int d){
		color = c;
		gearType = g;
		door = d;
	}
}

////////////// 출력 ////////////////////////////
White | auto | 2
Blue | manual | 4

 

5) 생성자 this()

  • 생성자에서 다른 생성자를 호출할 때 사용 => 코드의 중복을 제거하기 위해 사용
  • 같은 클래스 안에서 다른 생성자를 호출하는 경우 사용됨
  • 다른 생성사 호출 시 첫 줄에서만 사용 가능
class Game{
	String name; // 이름
	String classful; // 직업
	int level; // 레벨
	
	Game(String n, String c, int l){
		name = n;
		classful = c;
		level = l;
	}
	
	Game(){ 
		// 기본 생성자에 this 로 위의 Game 생성자를 호출하면
		// 기본적으로 객체 생성 시 기본생성자에서 this 안에 정의 해 둔 값으로 초기화 됨 => 방법 1과 방법 2는 동일한 기능
		
		// 방법 1 
		this("기본이름", "기본직업", 0);
		
		// 방법 2
//		this.name = "기본이름";
//		this.classful = "기본직업";
//		this.level = 0;
	}
}

public class Prcatice_26_2 {

	public static void main(String args[]) {
		// Game 객체를 생성하고 따로 값을 넣어주지 않는 경우 출력되는 것은 기본 생성자에서 this() 안에 넣어둔 값과 같다
		Game g = new Game();
		System.out.println(g.name + " | " + g.classful + " | "+ g.level);

	}
}


//////////// 출력 ///////////
기본이름 | 기본직업 | 0
  • 이때 방법 1은 코드의 중복을 제거하고 보다 간결해지게 작성된 코드이다.

 

6) 참조변수 this

  • 인스턴스 자신을 가리키는 참조변수 => 위의 생성자 this() 와는 전혀 다른 개념임
  • 인스턴스 메서드(생성자 포함)에서 사용 가능
  • 지역변수(lv) 와 인스턴스 변수(iv) 를 구별할 때 사용 => 물론 이 외에도 여러 방면에서 사용됨

 

  • Computer 클래스를 생성하고 인스턴스 변수 cpu, graphicCard, memory 를 설정하였다.
  • Computer() 기본생성자와 Computer(매개변수) 인 생성자 2개를 각각 만들었다.
  • 이때 Computer(매개변수) 생성자에서 참조변수 this. 을 사용하여 클래스 단에서 정의된 인스턴스 변수 cpu, graphicCard, memory 와 매서드 매개변수로 설정된 지역변수 cpu, graphicCard, memory 를 구분하였다.
  • 이후 Computer 객체를 기본생성자를 호출하여 만드는 경우 와 매개변수를 포함하는 생성자를 호출하여 만드는 경우의 각각 출력 형태를 비교해보았다.
class Computer{
	String cpu;
	String graphicCard;
	int memory;
	
//	Computer(String c, String g, int m){
//		// 이때 지역 변수(lv)는 c, g, b && 인스턴스 변수(iv)는 cpu, graphicCard, board
//		// 현재는 지역 변수명과 인스턴스 변수명이 서로 다르기 때문에 iv 앞에 this. 가 안붙어도 상관X
//		cpu = c;
//		graphicCard = g;
//		memory = m;
//	}
		
	Computer(String cpu, String graphicCard, int memory){
		// 이때 지역 변수(lv)는 cpu, graphicCard, board && 인스턴스 변수(iv)는 cpu, graphicCard, board
		// 지역 변수명과 인스턴스 변수 명이 서로 동일!! 이 때문에 지역 변수와 인스턴스 변수 구분을 위해 인스턴스 변수 앞에 this. 사용
		this.cpu = cpu;
		this.graphicCard = graphicCard;
		this.memory = memory;
	}
    
    
    Computer(){ // 기본 생성자 활용
		this("Amd", "RTX2060", 16);
	}
}

public class Prcatice_26_2 {

	public static void main(String args[]) {

		Computer com1 = new Computer(); // 기본 생성자 호출
		System.out.println(com1.cpu + " | " + com1.graphicCard + " | " + com1.memory);
		
		Computer com2 = new Computer("Intel", "RTX2070", 8); // 매개변수를 포함하는 생성자 호출
//      이렇게 하면 아래와 같이 정의한 것과 동일함
//		com2.cpu = "Intel";
//		com2.graphicCard = "RTX2070";
//		com2.memory = 8;
        
        System.out.println(com2.cpu + " | " + com2.graphicCard + " | " + com2.memory);
	}
}

각각 기본생성자, 매개변수를 포함하는 생성자

 

가장 중요한 부분!! 
1. 생성자는 기본 생성자와 매개 변수가 있는 생성자로 구분된다.
- 기본 생성자 : 매개변수를 갖지 않으며, 해당 클래스의 인스턴스 객체가 생성될 때 가장 먼저 실행되는 메서드. 만약 직접 작성하지 않는다면 있는 것으로 취급하고 실행됨
- 매개 변수를 갖는 생성자 : 인스턴스 객체가 생성될 때 매개 변수를 통해 인스턴스 변수(필드 변수) 를 초기화 해 줌.

2. 참조변수 this. 와 생성자 this()
- this. : 인스턴스 자신이 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다. 모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다.

- this() , this(매개변수) : 생성자, 같은 클래스의 다른 생성자를 호출 할 때 사용된다. 매개 변수 명과 인스턴스 변수 명이 동일한 경우, this 를 생략하면 안된다

 

댓글