ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java]STEP1 - 8) 인스턴스 멤버, 정적 멤버, this, static, 싱글톤, final과 상수(static final)
    개발 공부/Java 2020. 9. 18. 21:09

     

    본 게시글은 도서 "이것이 자바다" 동영상 강의를 듣고 기록하는 TIL(Today I Learned) 입니다.
    모든 저작권은 출판사 한빛미디어와 신용권님께 있음을 알립니다.👍

     

     

    이번 게시물에서는 인스턴스 멤버와 정적 멤버란 무엇인지?

    this는 어떻게 사용하는지, 싱글톤은 무엇인지, final과 static final에 대해서 알아봅시다.

     

    1. 인스턴스 멤버와 this


    인스턴스 멤버: 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 말한다.

                                객체 없이는 사용할 수 없다.

     

    // Person 클래스
    public class Person {
        String name;

        void setAge(int age) {
             ...
        }
    }

    Person person = new Person(); // person 인스턴스 생성

    person.name  ▶  인스턴스 필드
    person.setAge(10) ▶  인스턴스 메소드

     

    메모리 상에서 인스턴스 필드는 객체마다 따로 존재하고, 인스턴스 메소드는 객체마다 존재하는 것이 아니라 메소드 영역에 저장되어 공유된다.

     

     

    this : 객체 내부에서 인스턴스 멤버에 접근하기 위해 사용하는 것.

     

    this는 쉽게 말해서 '나'라는 의미이다. 객체가 자기 자신의 인스턴트 필드나 메소드를 명시할 때 사용한다.

    // Person 클래스
    public class Person {
        String name;
        int age;

        void setAge(int age) {
             this.age = age;
        }
    }

    Person 클래스에는 int age 가 필드로 명시되어있다.
    내부 메소드인 setAge는 외부에서 들어온 age 값을 Person 객체의 age 필드에 대입하는 역할을 한다.

    이때, Person 객체의 age 필드와 setAge의 파라미터 값인 age가 이름이 동일하기 때문에
    age 필드는 this.age로 Person 객체의 필드라는 점을 명시하여 같은 age라도 구별을 해주어야 한다.

     


     

    2. 정적 멤버와 static


    정적 멤버: 클래스에 고정된 멤버로서 객체를 생성하지 않고도 사용할 수 있는 필드와 메소드.

                        클래스의 바이트 코드 한 곳에만 존재하는 멤버.

     

     

    2-1) 정적 멤버 선언

    public class Calculator {
         static double pi = 3.141592;

         static int plus(int x, int y) { return x + y; }
    }

    정적 멤버를 선언할 때는 static 을 이용해 선언하면 된다.
    static이 붙은 정적 멤버는 따로 객체를 생성하지 않아도 사용할 수 있다.

    필드는
    객체마다 가지고 있어야 할 데이터라면 인스턴스 필드로 선언하는게 좋고,
    객체마다 가지고 있을 필요가 없는 공용 데이터라면 정적 필드로 선언하는게 좋다.

    메소드는
    인스턴스 필드를 이용해서 실행해야 한다면 인스턴스 메소드로 선언하고,
    인스턴스 필드를 이용하지 않는다면 정적 메소드를 선언한다.

     

    2-2) 정적 멤버 사용

    public class Calculator {
        static double pi = 3.141592;
       
        static int plus(int x, int y) { return x + y; }
    }
    Calculator 클래스에 정적 필드와 정적 메소드가 선언되었다면,


    // 반지름이 10인 원의 넓이
    int tenCircle  =  10 * 10 * Calculator.pi;

    // 10 더하기 10
    int plusResult  =  Calculator.plus(10, 10);

    정적 필드와 정적 메소드는 위와 같이 클래스 이름으로 직접 접근할 수 있다.

     

    2-3) 정적 초기화 블록

    정적 블록: 정적 필드의 복잡한 초기화 작업을 할 수 있는 블록.

    public class Person {
        static String name;
        static int age;

        static {
            name = "Kyle Kim";
            age = 26;
        }
    }

    Person 클래스내에 name과 age가 각각 정적 필드로 초기값이 없이 선언되어 있다.
    그 다음 static { } 정적 블록에서 name과 age를 초기화 하는 방식으로도 사용이 가능하다.

         < 주의 사항 >

    • 정적 블록에는 인스턴스 필드나 인스턴스 메소드를 사용할 수 없다.
    • this 키워드도 사용할 수 없다.
    • 만약 정적 블록에서 인스턴스 멤버를 사용하고 싶다면, 정적 블록 안에 new 연산자를 통해 객체를 먼저 생성하고 사용할 수는 있다.

     


     

    3. 싱글톤(Singleton)


    싱글톤(Singleton) : 전체 프로그램에서 단 하나의 객체만 만들도록 보장해야 하는 경우, 단 하나만 생성되는 객체.

     

    싱글톤 만드는 순서

    1. 먼저 클래스의 생성자 앞에 private 접근 제한자를 붙인다.
    2. 자신의 타입인 정적 필드를 하나 선언한다.
    3. new 연산자를 통해 자신의 객체를 생성하여 2번의 정적 필드를 초기화 한다.
    4. 외부 호출을 위해 정적 메소드인 getInstance()를 선언한다.
    5. getInstance() 메소드 안에서는 자신의 객체를 return 한다.
    public  class Singleton {
        private static Singleton singleton = new Singleton();

        private Singleton() { }

        static Singleton getInstance() {
            return singleton;
        }
    }

    외부에서 유일하게 참조할 수 있는 것은 getInstance() 뿐이므로 필드와 생성자는 private을 붙여준다.

    단 하나의 객체만 생성해야 하므로  Singleton필드와 getInstance() 메소드에는 static을 붙여준다.

    getInstance() 메소드는 외부에서 호출 할 경우 singleton 객체를 반환한다.

     


     

    4. final 필드와 상수(static final)


    final 필드: 초기값이 저장되면 이것이 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없는 것.

    final String nation = "Korea"; 와 같이 선언한다.

     

    final 필드의 초기값을 줄 수 있는 방법은 필드 선언 시에 주거나, 생성자에서 주는 두 가지 밖에 없다.

    따라서 final 필드의 값을 필드 선언이나 생성자에서 주지 않으면, 컴파일 에러가 발생한다.

     

     

     

    상수(static final) : 불변의 값을 말하며, 단 하나 밖에 존재하지 않고 한 번 선언하면 바꿀 수 없는 것.

    static final double PI = 3.141592; 와 같이 선언한다.

     

    상수 이름은 모두 대문자로 쓰는 것이 보통의 관례이다.

    static final 필드는 객체마다 저장되지 않고, 클래스에만 포함된다. 그리고 한 번 초기값이 저장되면 변경할 수 없다.

     

     

     

     

    본 게시글은 여기서 마치겠습니다.

    읽어주셔서 감사하고, 혹시나 틀린 부분이나 보완해야할 부분이 있다면 댓글에 남겨주세요~!

    댓글

Designed by Tistory.