PLOD

[Java] 클래스- 생성자(Constructor) 본문

개발 공부/Java

[Java] 클래스- 생성자(Constructor)

훌룽이 2023. 1. 12. 23:59

* 클래스(class)

클래스는 하나의 클래스로부터 여러 개의 객체를 생성하기 위해 사용되는 하나의 판이자, 특정 작업을 수행하기 위한 명령문의 집합. 자바에서는 반드시 new 연산자를 사용하여 객체를 생성한다. 보통 클래스는 변수와 메서드로 이루어져 있다.

// Student 클래스 생성

public class Student{
	public String studentName;			//학생이름
   	public int studentNum; 				//학번
}

위의 클래스를 보면 학생이름 과 학번 변수를 생성해 주었다, 클래스 내에서 생성되는 변수들을 통틀어 필드(인스턴스 필드) 라고 한다. 

클래스를 만드는 이유? 객체지향프로그래밍을 위해 객체지향프로그래밍은 자바 프로그래밍의 핵심이다.

 

*객체지향프로그래밍의 특징

- 추상화

- 캡슐화

- 상속(Abstract)

- 다형성(method overloading, overiding)

 

* 생성자(Constructor)

생성자는 인스턴스가 생성될 때, 호출되는 인스턴스 초기화 메서드이다. 따라서 인스턴스 변수 초기화 작업에 주로 사용되고 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.

Ⅰ . 생성자는 클래스와 이름이 같으며 반환형이 없다. 
Ⅱ . 생성자는 객체를 초기화 해주는 역할을 해준다. 생성자는 객체를 생성하려면 반드시 호출해야 한다.
Ⅲ . 생성자는 선언되지 않으면 컴파일러가 자동으로 기본 생성자를 추가한다.
Ⅳ . 생성자는 보통 매개변수를 입력받아 생성되는데 , 이때 this가 사용된다.
// 기본 생성자

public Student(){}

// 생성자 overloading

public Student(int studentNum, String studentName) { 	// 생성자는 클래스 이름과 같다 + 리턴 값이 없다	

	this.studentNum = studentNum;		//this : 객체 자신에 대한 참조값을 가지고 있다
   	this.studentName = studentName;
    
}

 

위와 같이 생성자끼리 이름이 같고 매개변수를 다르게 하는 것을 생성자 오버로딩(overloading) 이라고 한다.

Card card = new Card();

Card 클래스의 인스턴스를 생성하는 코드를 예로 들어, 수행되는 과정을 단게별로 나누어 보면 다음과 같다.

연산자 new에 의해서 heap 메모리에 Card 클래스의 인스턴스가 생성된다. 그 다음 Card 생성자가 호출되어 수행되고, 연산자 new의 결과로, 생성된 Card 인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

* 접근제한자

 

 

-  public : class , package가 동일하지 않아도 모든 접근이 가능

-  private : 모든 접근이 불가능하고 같은 class 내에서만 접근 가능

-  protected :  상속, 추상관계에서 사용 자식 클래스 , 패키지 내에서만 사용가능

-  default :  접근 제한자가 없고 , 같은 패키지 내에서만 접근 가능 

* final 멤버

final 필드는 초기값이 저장되면 값을 변경할 수 없다.  보통 변수는 생성자에서 초기화 할 수 있는데, final은 상수이기 때문에 초기화를 못한다. final의 필드명은 대문자로 작성하는 것이 관행이다.  

 

final 클래스는 더이상 상속할 수 없는 종단 클래스를 의미한다. final 메서드도 마찬가지로 종단 메서드를 의미한다. final 메서드는 모든 메서드를 오버라이딩 할 수 없다. 

* Static 멤버

인스턴스 필드와 반대 개념, static으로 선언된 필드와 메소드를 의미한다 . 객체를 반드시 사용해야 하는 인스턴스 필드와 메소드와는 달리, 정적 필드와 정적 메소드는 객체 생성 없이 클래스를 통해 접근 할 수 있다. 

 

아래  Temp 클래스를 통해 객체가 생성될 때마다 count 변수를 초기화 시켜주지 않고 1씩 증가 시켜 값을 누적시키고 싷을떄 static을 사용하면 값이 초기화 되지 않는다.

 

- Temp 클래스

public class Temp {
	private int su;
	private static int count;		// static 변수, class 변수(this,객체명 접근 불가)

	public Temp() {
		++count;					// 누적 가능
	}
	public void setSu(int su) {
		this.su = su;
	}
	public void disp() {
		System.out.println("su : " + su);
		System.out.println("count : " + count);
	}
	
	public static void countInfo() {			// static 메소드는 객체를 생성하지 않고 클래스로 부른다.
		System.out.println(count);				
	}
}

- main 클래스

public class Exam {
	public static void main(String[] args) {
    
		Temp a = new Temp();
		a.setSu(1);
		a.disp();
		
		
		Temp b = new Temp();
		b.setSu(10);
		b.disp();
		
		Temp c = new Temp();
		c.setSu(77);
		c.disp();
		
		Temp.countInfo();
	}
	
}

- 출력

더보기

su : 1

count : 1

su : 10

count : 2

su : 77

count : 3

3

Comments