JAVA

[JAVA] 생성자와 은닉성

shb 2021. 10. 9. 18:19

1. this
  1-1. 현재 클래스의 메서드를 의미하는 용도로서의 this

class Foo{
public String getName(){
String name = "자바학생";
return name;
}

public void sayName(){
String myname = this.getName();
System.out.println(myname);
}
}

-> this.getName()메서드는 this 키워드를 사용하여 현재 클래스 안에 포함된 다른 메서드임을 명시하고 있다.
-> 하지만 메서드의 경우 다른 클래스의 메서드를 이름만으로 호출할 수 있는 방법이 없기 때문에, this.getName()이 아닌 getName()만 사용하더라도 코드 가독성의 문제는 없다.

 

 


2. 클래스, 메서드, 상수의 이름 규칙
 2-1. 공통 이름 규칙
  - 영어 + 숫자 + 언더바(_)의 조합이고, 첫 글자는 반드시 영어로 표기한다.

 2-2. 클래스 이름 규칙
  - 첫 글자는 대문자로 시작, 나머지 글자는 소문자로 표시한다.
  - 두 개 이상의 단어를 조합해야 할 경우 새로운 단어는 대문자로 시작
-> class MyClass, class Student, class NetworkHelper

 2-3. 메서드, 변수 이름 규칙
  - 대부분 소문자로 구성되지만, 두 개 이상의 단어를 조합할 경우 새로운 단어는 대문자로
  표시한다.
-> int age, String userName, String user_name, String memeberCount

 2-4. 상수 이름 규칙
  - 모두 대문자로 표시한다
-> final double PI, final int COLOR
   
3. 생성자
 3-1. 생성자란?
  - new 키워드를 사용하여 객체가 생성될 때 자동으로 실행되는 특수한 형태의 메서드.
  - 리턴형을 명시하지 않으며, 메서드의 이름은 클래스와 동일하다.

class Foo{
Foo(){
// 이 안은 객체가 생성될 때 자동으로 호출된다.
}
}

Foo foo = new Foo();

  - 자동으로 실행된다는 특성 때문에, 객체가 생성되면서 해당 객체의 특성을 초기화 하기 위하여
  사용된다.(ex:멤버변수의 초기값을 할당하는 용도)

  3-2. 기본 생성자
    - 파라미터가 없는 생성자
    - 클래스에 특별히 생성자가 정의되지 않은 경우 java컴파일러는 기본 생성자가 존재한다고 인식한다.

class Foo{
Foo(){
// 생성자는 있지만, 내용은 비어 있다.
}
}

 


  3-3. 파라미터를 갖는 생성자
   - 생성자도 메서드의 한 종류이므로 파라미터를 함께 정의하는 것이 가능하다.
   - 생성자의 파라미터를 멤버변수에 복사하는 것으로 객체의 초기화를 외부적인 요인에 의해 처리할 수 있다.

class Foo{
String name;
int age;

Foo(String name, int age){
// 생성자 파라미터의 값을 멤버변수에 할당
this.name = name;
this.age = age;
}
}

-> 생성자에 파라미터가 정의된 경우 객체 생성 구문에서 해당 파라미터를 전달해야 한다.
Foo obj = new Foo("자바학생", 25);

 


4. 은닉성
  4-1. 은닉성이란?
   - 멤버변수나 메서드가 객체에 노출되지 않도록 설정하는 기법
   - 객체를 사용하는 측의 실수로 인한 기능의 오작동을 방지하기 위해, 
   클래스의 일부를 숨기는 처리를 말한다.

  4-2. 적용방법
   - 변수의 이름이나 메서드 이름 앞에 "접근 한정자"를 지정한다.

접근 한정자 설명
public    모든 곳에서 접근 가능하다.
             일반적으로 모든 메서드 앞에 명시한다.
private   클래스 안에서만 사용가능하고, 객체를 통해 접근할 수 없다.
             일반적으로 모든 멤버변수 앞에 명시한다.
protected 현재 클래스 내의 다른 자원이나, 같은 패키지 안에 존재하는 클래스와
               하위 클래스에서 접근 가능하다. 잘 사용하지 않는다.
default    접근 한정자를 명시하지 않은 경우. 현재 클래스 내의 다른 자원이나
              동일 패키지 내의 다른 클래스에서 접근 가능하다. 잘 사용하지 않는다.

 


  4-3. getter, setter
   - 멤버변수가 은닉된 형태로 선언된 경우 프로그램의 가장 근본적인 목적인 데이터에 접근하는 방법이 사라지므로

메서드를 통하여 간접적으로 접근하는 방법이 마련되어야 한다.
   - getter, setter는 은닉된 멤버변수에 간접적으로 접근하기 위하여 정의된 메서드들을 의미하는 용어이다.

-> Getter : 은닉된 멤버변수의 값을 리턴하기 위한 메서드
-> Setter : 파라미터로 전달된 값을 멤버변수에 복사하기 위한 메서드

   - 메서드 작성 예
   멤버변수이름    getter setter
   String userName             String getUserName()            void setUserName(String param)
   int userAge                   int getUserAge()                    void setUserAge(int param)

-> "get", "set" 접두사 뒤에 변수이름을 첫 글자가 대문자인 형태로 명시
-> getter는 연결된 멤버변수의 데이터 타입을 리턴형으로 명시
-> setter는 연결된 멤버변수의 데이터 타입을 파라미터형으로 명시

  - Setter
-> 무결성 : 데이터의 정확성과 일관성을 유지하고 보증하는 것
(ex: 물건의 가격은 음수일 수 없다. -> price 최소값이 0)
-> 외부에서는 해당 집합의 세부 내용에 집중하지 않도록 함.

  - Getter
-> 변수들의 외부 노출을 제한하고, 노출 범위를 정해주는 것
-> 내부에 가공된 값을 꺼낼 수 있다.
 


  4-4. 클래스에 접근 한정자를 지정한 경우
  
접근한정자 설명
public          객체 생성 가능하다.
                  서로 다른 소스코드에 정의된 클래스끼리도 객체 생성이 가능하다.
private         클래스에 적용할 수 없다.
protected     클래스에 적용할 수 없다.
default         동일한 소스코드에 정의된 클래스끼리만 객체로 생성 가능하다.
                  (지금까지의 예제 형태)

   - 클래스의 분리
-> 하나의 소스코드에서 프로그램의 모든 기능을 구현하게 되면
유지보수에 비효율적이므로, 기능단위로 소스코드를 분리해야 한다.
-> 소스코드가 분리된 클래스끼리는 public이 명시되어야만 서로 객체 생성이 가능하다.
-> 일반적으로 클래스 정의에는 public 접근 한정자만 사용한다.
-> 하나의 소스코드에는 하나의 public 클래스만 존재할 수 있다.