객체지향언어의 생성자와 정보은닉/ 접근제어 지시자 그리고 Static에 대해서 알아보겠습니다.
1) 생성자(Constructo)
: 객체가 생성될 때 초기화를 위해 실행되는 메소드를 의미합니다.
- 생성자 이름은 클래스 이름과 반드시 동일 해야합니다.
- 생성자 여러 개작성 가능 (오버로딩) 합니다.
- 생성자는 new를 통해 객체를 생성할 때, 객체당 한 번 호출됩니다.
- 생성자는 리턴 타입을 지정할 수 없습니다.
- 생성자의 목적은 객체 초기화하는 것입니다.
- 생성자는 객체가 생성될 때 반드시 호출됩니다. 그러므로 하나 이상 선언 되어야합니다.
- 생성자를 작성하지 않았으면 컴파일러가 자동으로 기본 생성자 삽입합니다.
- 반환형이 선언하지 않으면서, 반환하지 않는 메소드 입니다.
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);
}
제목과 저자를 나타내는 title과 author 필드를 가진 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 레퍼런스 사용할 수 없습니다.
'빅데이터 > JAVA' 카테고리의 다른 글
[JAVA] System.out.println() , 자바의 메모리 모델 (0) | 2020.04.30 |
---|---|
[JAVA] 객체지향언어(오버로딩, this, 클래스매서드) (0) | 2020.04.29 |
[JAVA] 객체지향언어(Object oriented Programming) [Class, new] (0) | 2020.04.26 |
[JAVA] METHOD (0) | 2020.04.25 |
[JAVA] 반복문(While문, Do While문, For문) (0) | 2020.04.25 |