728x90

 

 

생성자(constructor)

메소드명이 클래스명과 동일하고 리턴 자료형을 정의하지 않는 메소드

 

new연산자가 heap 메모리에서 생성한 공간에 값을 초기화하는 역할을 하고 나서

생성자가 객체의 필드 초기화시키는 역할

public class Academy { private int studentNo; private String name;
    // 기본 생성자 
    public Academy() {} 

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

 

 

종류

매개변수 있느냐 없느냐가 기준

 

1)기본 생성자(default constructor)

매개변수가 없는 생성자

작성하지 않은 경우, 클래스 사용 시 JVM이 자동으로 기본 생성자 생성

 

2)매개변수 생성자

매개변수가 있는 생성자

 

1)매개변수를 통해 전달받은 값으로 필드 초기화

    - 매개변수가 있기에 매개변수를 통해서 값을 받을 수 있다

    - 매개변수를 통해 필드 초기화한다는 의미는 값을 넣는다는 의미를 포함한다

2)기본 생성자를 만들어두지 않고 매개변수가 있는 생성자만 만들었을 경우 기본생성자는 자동으로 생성되지 않음

      (매개변수 생성자 작성시, 자동생성x)

3)상속에서 사용시, 반드시 기본생성자 작성

4)오버로딩을 이용하여 작성

 

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

  • 매개변수 생성자 작성 시, JVM이 기본 생성자를 자동으로 생성해주지 않음
  • 상속에서 사용 시 반드시 기본 생성자를 작성
  • 오버로딩을 이용하여 작성

 

생성자 규칙

  1. 클래스명과 메소드명이 동일하다.
  2. 리턴타입을 정의하지 않는다. (void도 사용하지 않는다.)

 

특징

생성자(Member())도 메소드의 일종으로 취급

메소드가 아닌 이유 : 생성자의 규칙이 있기 때문

생성자와 메소드의 차이

Member()라고 하는 생성자에도 ()가 들어가있음

*소괄호 ( ) : 매개변수 지정하는 역할

 


 

생성자와 관련된 개념

 

오버로딩(Overloading)

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

 

오버로딩 조건

1)같은 메소드 이름

2)매개변수의 개수 or 타입 or 순서가 달라야함

     반환타입에 영향 안줌

     매개변수에만 영향을 줌

     매개변수명이 다르다고 해도 개수,타입,순서가 같으면 중복에러남

 

this 레퍼런스 변수

예약어로써, 모든 인스턴스 메소드에 숨겨진 채 존재하는 레퍼런스로 할당된 객체를 가리킴

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

  • 인스턴스 자신을 가리키는 참조변수
  • this()생성자와 연관 x
  • 인스턴스 메서드(생성자 포함)에서 사용가능
  • 지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용
  • 내 주소값을 가지고 있는 변수
public class Academy{
		private String name; 
		public Academy() { }
		public Academy(String name) { **this.name = name;**  }
}

주황색 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;  
		}
}

주황색 name끼리 같은 데이터

파란색 name끼리 같은 데이터

 

728x90
반응형
728x90

생성자 this()

생성자에서 다른 생성자 호출할 때 사용

코드 중복을 제거할려고 this() 사용

 

원래 코드는 Car(color, “auto”, 4)로 호출해야함

this()생성자를  사용하므로써 이렇게 this(color, “auto”, 4) 

 

 

코드의 중복

Car() { // Car()의미는 () 안에 매개변수를 아무 값도 지정하지 않았으면 
        // 디폴트 값으로 아래의 세가지를 넣으라는 것
	color = "white";
	gearType = "auto";
	door = 4;
}

 

이미지 왼쪽의 중복된 코드(변경 전)

class Car{
	String color;
	String gearType;
	int door;
//////////////////////////////////////////////////////////
			Car() {                         // 1번 Car()
				color = "white";
				gearType = "auto";
				door = 4;
			}
			
			Car(String c, String g, int d){ // 2번 Car()
				color = c;
				gearType = g;
				door = d;
			}
}        // 1번 Car()와 2번 Car()가 같은 코드로 중복(bad)

 

이미지 오른쪽에 코드의 중복을 제거한 코드(변경 후)

class Car{
	String color;
	String gearType;
	int door;
//////////////////////////////////////////////////////////
		Car() {
			// Car("white","auto",4);
			this("white","auto",4);   // 바로 Car생성자의 매개변수로 값 대입
		}  // 중복 제거(good)
		
		Car(String c, String g, int d){
			color = c;
			gearType = g;
			door = d;
		}
}

 


 

참조변수 this.

인스턴스 자신을 가리키는 참조변수(reference variable)

 

특징

인스턴스 메서드(생성자 포함)에서만 사용 가능

    - 클래스 메소드(static 메소드)에서 사용 불가

지역변수(lv)와 인스턴스 변수(iv)를 구별할 때 사용

인스턴스의 주소가 저장되어있다

모든 인스턴스 메서드에 지역변수로 숨겨진 채로 존재한다(생략 가능)         

    - 전역변수와 지역변수 구분을 위해 쓰는 경우는 생략하면 에러는 아니나 지역변수 = 지역변수;가 되버려서 의미x

    - this를 선언안해도 사용가능. 선언한 적 없는데 사용할 수 있는 변수

 

ex)

long a ,b;

참조변수 long a ,b의 진짜 이름은 this.a, this.b

long add() {
	return a + b; // return this.a + this.b;

 

 

728x90
반응형
728x90

 

오늘 코딩으로 

다량의 주문이나 DB관리 때 런파일에서 간단하게 수치만 바꿔서 관리할 수 있는 아주 편리한 기능을 배웠다!!

 

실행 클래스

public class Run {
	public static void main(String[] args) {	
		Book b1 = new Book();
//		b1.inform();
				
		Book b2 = new Book("책1","출판사1","저자1");
//		b2.inform();
				
		Book b3 = new Book("책2","출판사2","저자2",10000,0.3);
		b3.inform();
				
	}

}

 

 

기능 클래스

public class Book {
	
	private String title;
	private String publisher;
	private String author;
	private int price;
	private double discountRate;
	
	// 기본 생성자
	public Book() {
				
	}
	
	// 매개변수 3개인 생성자
	public Book(String title, String publisher, String author) {
		this.title = title;			// 값넣기까지 초기화 // 값을 대입시키는게 초기화
		this.publisher = publisher;
		this.author = author;
	}
	
	// 매개변수 5개인 생성자
	public Book(String title, String publisher, String author, 
				int price, double discountRate) {
		this.title = title;
		this.publisher = publisher;
		this.author = author;
//		this(title,publisher,author); 	// this() 생성자
		this.price = price;
		this.discountRate = discountRate;
		
	}
	
	public void inform() {
		System.out.printf(" title : %s%n publisher : %s%n author : %s%n price : %d%n 할인율 : %f",title,publisher,author,price,discountRate);
	}
	
}

 

728x90
반응형
728x90

 

 

 

728x90
반응형

+ Recent posts