객체지향언어의 생성자와 정보은닉/ 접근제어 지시자 그리고 Static에 대해서 알아보겠습니다.

 

1) 생성자(Constructo)

: 객체가 생성될 때 초기화를 위해 실행되는 메소드를 의미합니다.

 

  1. 생성자 이름은 클래스 이름과 반드시 동일 해야합니다.
  2. 생성자 여러 개작성 가능 (오버로딩) 합니다.
  3. 생성자는 new를 통해 객체를 생성할 , 객체당 한 번 호출됩니다.
  4. 생성자는 리턴 타입을 지정할 수 없습니다.
  5. 생성자의 목적은 객체 초기화하는 것입니다.
  6. 생성자는 객체가 생성될 때 반드시 호출됩니다. 그러므로 하나 이상 선언 되어야합니다.
  7. 생성자를 작성하지 않았으면 컴파일러가 자동으로 기본 생성자 삽입합니다.
  8. 반환형이 선언하지 않으면서, 반환하지 않는 메소드 입니다.
public class Book {
	String title;
	String author;
	
	public Book(String t) { // 생성자
		title = t; author = "작자미상";
	}
	
	public Book(String t, String a) { // 생성자
		title = t; author = a;
	}
	
	public static void main(String [] args) {
		Book littlePrince = new Book("어린왕자", "생텍쥐페리"); 
		Book loveStory = new Book("춘향전"); 
		System.out.println(littlePrince.title + " " + littlePrince.author);
		System.out.println(loveStory.title + " " + loveStory.author);
	}

제목과 저자를 나타내는 titleauthor 필드를 가진 Book 클래스를 작성하고, 생성자를 작성하여 필드를 초기화 하는 것입니다.

 

기본 생성자(default constructor)

 - 매개 변수 없고 아무 작업 없이 단순 리턴하는 생성자입니다.

 - 디폴트 생성자라고도 부르기도 합니다. 클래스에 생성자가 하나도 선언되지 않은 경우, 컴파일러에 의해 자동으로 삽입 됩니다.

 = class 안에 하나라도 생성자를 작성하면 기본 생성자가 삽입 되지않습니다.

 

 

2) 정보은닉 / 접근제어지시자 

 

● 정보은닉

private 정보 은닉 - 접근의 하지 못하게 하고 private 이 들어간 자료형을 사용하려고 하면 error를 발생시킵니다.

즉, 자신의  영역 안에서는 접근을 가능하게 하지만, 내 영역 이외의 곳에서는 해당 데이터가 담겨있는 것을 가져올 수 없도록 만듭니다.

 인스턴스 변수의 private 
class FruitSeller      
{      
private int numOfApple;      
private int myMoney;      
private final int APPLE_PRICE;         
} 

class FruitBuyer      
{     
private int myMoney;      
private int numOfApple;          
} 

보통 field는 private으로 만들고 , method(기능)에 한에서는 public으로 선언해서 자료형을 사용할 수 있도록 합니다. 그래서 데이터는 함부러 읽어가지 못하게 하고, 기능은 사용할 수 있게 하는 것이 컨셉으로 합니다.

 

 

● 접근제어 지시자

   public > protected > default > private

 

- private : 클래스 내부(메소드)에서만 접근 가능합니다.

- public : 어디서든 접근 가능합니다.(접근을 제한하지 않습니다.)

- default : 접근제어 지시자 선언을 하지 않은 경우 , 동일 패키지 내에서의 접근 허용합니다.

- protected : 상속 관계에 놓여 있어도 접근을 허용, default 선언으로 접근 가능한 영역 접근 가능, 상속 관계에서도 접근 가능합니다. 

 

 

접근 지정자의 목적

- 클래스나 일부 멤버를 공개하여 다른 클래스에서 접근하도록 허용합니다.

- 객체 지향 언어의 캡슐화 정책은 멤버를 보호합니다.

- 접근 지정은 캡슐화에 묶인 보호를 일부 해제할 목적입니다.

 

 

 

 

3) Static

: 객체마다 생기는 것이 아며 클래스당 하나만 생성됩니다. 또한 객체를 생성하지 않고 사용합니다.

- 특성

공간적 특성 - static 클래스 당 하나만 생성합니다.

시간적 특성 - static 클래스가 로딩될 때 공간 할당합니다.

공유의 특성 - static 동일한 클래스의 모든 객체에 의해 공유합니다.

 

non-static

공간적 특성 객체마다 독립적으로 별도 존재합니다.

시간적 특성 필드와 메소드는 객체 생성 후 비로소 사용합니다.

비공유 특성 - 다른 객체에 의해 공유되지 않고 배타적 사용합니다.

 

class StaticSample {
	int n; 						// non-static 필드
	void g() {...} 			// non-static 메소드

	static int m; 			// static 필드
	static void f() {...} // static 메소드

 

● Static 활용

1) 전역 변수와 전역 함수를 만들 때 활용합니다.

public class Math {
   public static int abs(int a);
   public static double cos(double a);
   public static int max(int a, int b);
   public static double random();
   ...
}

잘못된 사용 방법
Math m = new Math();  // Math() 생성자는 private

바른 사용 방법
int n = Math.abs(-5);

2) 공유 멤버를 작성할 때

- static 필드나 메소드는 하나만 생성. 클래스의 객체들 공유

 

 

● static 메소드의 제약 조건

 - static 메소드는 non-static 이 접근할 수 없습니다.

 - 객체가 생성되지 않은 상황에서도 static 메소드는 실행될 수 있기 때문에, non-static 메소드와 필드 사용 불가합니다.

 - 반대로, non-static 메소드는 static 이 사용가능합니다.

 

 

 

- static 메소드는 this 사용불가합니다.

- static 메소드는 객체가 생성되지 않은 상황에서도 호출이 가능하므로, 현재 객체를 가리키는 this 레퍼런스 사용할 수 없습니다.

 

+ Recent posts