OOP_클래스_생성자

Brogod97·2022년 12월 16일
0

KH TIL

목록 보기
18/37
post-thumbnail

생성자(Constructor)

객체가 new 연산자를 통해 Heap 메모리 영역에 할당될 때, 객체 안에서 만들어지는 필드 초기화 + 생성 시 필요한 기능 수행

생성자는 일종의 메소드로 전달된 초기값을 받아서 객체의 필드에 기록
⇒ 새롭게 클래스를 만드는 기능을 수행

  • 생성자에도 접근 제어자가 있음
  • 컴퓨터 안 객체를 만들 때 필요한 것
    → 객체가 어떻게 생겼는지 정의하는 클래스
Student student = new Student(); 

생성자 규칙

  1. 생성자의 선언은 메소드 선언과 유사하나 반환 값이 없음

  2. 생성자명을 클래스명과 똑같이 지정해주어야 함


생성자 표현식

[접근제한자] [예약어] class 클래스명 {
	[접근제한자] 클래스명() { } // 기본 생성자
	[접근제한자] 클래스명(매개변수) { (this.)필드명 = 매개변수; } // 매개변수가 있는 생성자
}
public class Academy {
	private int studentNo;
	private String name;

	public Academy() {} // 기본 생성자
	public Academy(int studentNo, String name) { //매개변수 있는 생성자
		this.studentNo = studentNo;
		this.name = name;
	}
}

기본 생성자

: 작성하지 않은 경우, 클래스 사용 시 컴파일러가 자동으로 기본 생성자 생성

매개변수 생성자

  • 객체 생성 시 전달받은 값으로 객체를 초기화 하기 위해 사용

  • 매개변수 생성자 작성 시 컴파일러가 기본 생성자를 자동으로 생성해주지 않음

  • 상속에서 사용 시 반드시 기본 생성자를 작성

  • 오버로딩을 이용하여 작성


MVC 패턴
Model - View - Controller
간단한 이해로, 다음과 같이 생각하면 됨

  • Model: 클래스 등의 모음
  • View: 사용자가 보는 결과물
  • Constroller: 모델의 명령을 보내는 기능적인 것, 상태 변경 등
    → Constroller, Service, DAO, DTO(= VO, Value Object) 등이 있음

오버로딩 (Overloading)

: 한 클래스 내에 동일한 이름의 메소드를 여러 개 작성하는 기법

오버로딩 ≠ 오버라이딩 개념 숙지!

오버로딩 조건

  • 같은 메소드 이름
  • 다른 매개변수의 개수 또는 다른 매개변수 타입, 순서

오버로딩 작성 규칙

  1. 메소드 이름이 동일해야 함

  2. 매개변수의 자료형, 개수, 순서가 달라야 함

  3. 반환형은 같아도 되고, 달라도 됨

오버로딩 예시

public User() {
		// 기능
		System.out.println("기본 생성자로 User 객체 생성");
		
		// 필드 초기화
		userId = "user01";
		userPw = "pass01";
		userName = "홍길동";
		userAge = 20;
		userGender = 'M';
	}
	
    // 필드 일부를 초기화 하는 목적의 매개변수 생성자
	public User( String userId, String userPw ) {
		this.userId = userId;
		this.userPw = userPw;
		// 매개 변수로 전달받은 값을 필드에 초기화(this 참조변수)
	}
	
	// 필드를 전부 초기화 하는 목적의 매개변수 생성자
	public User(String userId, String userPw, String userName, int userAge, char userGender) {
		this(userId, userPw); // this() 생성자
		
		this.userName = userName;
		this.userAge = userAge;
		this.userGender = userGender;
	}
	
	// public User() {} // Error: 기본 생성자가 이미 작성되어 있어 중복으로 인식
	
	public User(String userId) {} // 매개변수의 개수가 같은 생성자가 없어서 오버로딩 성립
	
	public User(int userAge) {} // 매개변수의 개수는 같지만, 타입이 달라서 오버로딩 성립
	public User(String userId, int userAge) {} // 매개변수의 개수는 같지만, 타입이 달라서 오버로딩 성립
	
	public User(int userAge, String userId) {} // 매개변수의 개수와 타입은 같지만, 순서가 달라서 오버로딩 성립
	
	// Error: 매개변수의 개수, 타입, 순서가 모두 같음 (변수명은 신경쓰지 않음)
	// public User(int userAge, String userName) {} 
	
	/* Error: 매개변수의 개수, 타입, 순서가 모두 같음 (변수명은 신경쓰지 않음)
	 * 
	 * public User(String userId, String userPw, String userName) {}
	 * public User(String userName, String userId, String userPW) {}
	 */

오버로딩이 성립되지 않는 경우

public class Overloading{
	// 매개변수가 없는 경우 오버로딩 성립의 조건이 안됨
	// 반환 타입은 오버로딩 조건과 무관
	public void test(){}
	public int test(){ return 0; }

	// 매개변수의 갯수와 타입이 동일해서 성립하지 않음
	// 매개변수 이름은 오버로딩 조건과 무관
	public void test(String str){}
	public void test(String s) {}	

	// 매개변수의 갯수와 타입이 동일해서 성립하지 않음
	// 접근 제한자는 오버로딩 조건과 무관
	public void test(int i) {}
	private void test(int i){}
}

this

모든 인스턴스의 메소드에 숨겨진 채 존재하는 레퍼런스로, 할당된 객체를 가리킴
→ 참조형

함수 실행 시 전달되는 객체의 주소를 자동으로 받음

public class Academy{
  	private String name;
    
  	public Academy() {}
    
  	public Academy(String name) {
    	this.name = name;  
    }
}
  • 위와 같이 매개변수를 가지는 생성자에서 매개변수 명이 필드명과 같은 경우 매개변수의 변수명이 우선이므로 this 객체를 이용하여 대입되는 변수가 필드라는 것을 구분해줌

this 생성자란?

생성자, 같은 클래스의 다른 생성자를 호출할 때 사용, 반드시 첫 번째 줄에 선언해야 함

public class Academy{
  	 private int age;
 	 private String name;
 	 public Academy() { this(20, “김철수”); }
 	 public Academy(int age, String name) {
    	this.age = age;     
        this.name = name;  
 	 }
}

0개의 댓글