ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Java 자바] 6. 클래스 ④ this, static, final, static final
    Programming/Java 2022. 7. 31. 15:00
    반응형

    6-9. 인스턴스 멤버와 this

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

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

    public class Car {
      String model;
      int speed;
      
      Car(String model) {
        this.model = model;
      }
    
      void setSpeed(int speed) {
      this.speed = speed;
      }
    
      void run() {
        for(int i = 0; i <= 50; i += 10) {
          this.setSpeed(i);
          System.out.println(this.model + "가 달립니다.(시속: " + this.speed + "km/h");
        }
      }
    }

    6-10. 정적 멤버와 static

    정적(static) 멤버는 클래스에 고정된 멤버로 객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 의미

    - 정적 멤버는 객체가 아닌 클래스에 소속된 멤버이기 때문에 클래스 멤버라고도 함

    6-10-1. 정적 멤버 선언

    - 필드와 메소드 선언시 static 키워드를 추가적으로 붙여 선언
    - 정적 멤버는 메소드영역에 저장되어, 클래스 로딩이 끝나면 바로 사용 가능
    - 인스턴스 필드를 이용해서 실행해야 할 경우 인스턴스 메소드, 이용하지 않는다면 정적 메소드로 선언

    public class 클래스명 {
      
      // 정적 필드
      static 데이터타입 필드명 [= 초기값];
      
      // 정적 메소드
      static 리턴데이터타입 메소드명(매개변수, ...) {...}
    
    }
    public class Calculator {
      String color;							// 인스턴스 필드
      void setColor(String color) { this.color = color; }		// 인스턴스 메소드
      static int plus(int x, int y) { return x + y; }		// 정적 메소드
      static int minus(int x, int y) { return x - y; }		// 정적 메소드
    }

    6-10-2. 정적 멤버 사용

    정적 멤버는 클래스 이름과 도트(.) 연산자로 접근 가능함

    클래스명.필드명;
    클래스명.메소드(매개값...);
    
    public class Calculator {
      static double pi = 3.14159;
      static int plus(int x, int y) { ... }
      static int minus(int x, int y) { ... }
    }
    
    double result1 = 10 * 10 * Calculator.pi;
    int result2 = Calculator.plus(10, 5);
    int result3 = Calculator.minus(10, 5);
    
    // 객체 변수로 우회 접근은 가능하나, 지양하는 것이 좋다.
    Calculator myCal = new Calculator();
    int result4 = myCal.plus(20, 5);	// 가능은 하나 경고표시가 뜸

    6-10-3. 정적 초기화 블록

    정적 필드는 필드 선언과 동시에 초기값을 주는 것이 보통이나, 계산이 필요한 초기화일 경우 정적 블록(static block) 활용

    public class Television {
      static String company = "Samsung";
      static String model = "LCD";
      static String info;
      
      // static 블록에 info의 초기값 설정
      static {
        info = company + "-" + model;
      }
    }
    
    // 단, 정적 블록을 선언할 때 인스턴스 필드나 인스턴스 메소드를 사용할 수는 없다.
    // 정적 영역은 별도의 메모리 영역에서 먼저 실행되므로, 객체가 생성되어야 생기는 인스턴스 필드, 메소드는 미리 사용할 수 없다.
    
    public class ClassName {
      int field1;
      static field2;
      
      static {
        field1 = 10;	// 컴파일 에러
        field2 = 20;
      }
     }

    6-10-4. 싱글톤(Singleton)

    전체 프로그램에서 단 하나의 객체만 만들도록 해야할 때 사용하는 디자인 패턴

    public class 클래스명 {
      
      // 정적 필드
      private static 클래스명 필드명 = new 클래스명();
      
      // 생성자
      private 클래스명() {}
      
      // 정적 메소드
      static 클래스명 getInstance() {
        return 필드명;
    
      }
    }

    - 외부에서 객체를 얻는 유일한 방법은 getInstance() 메소드를 호출하는 방법이며,
       이 때 getInstance() 메소드는 단 하나의 객체만 리턴함

    public class Manager {
    
      // 클래스 내부에서 생성자 호출하고 외부에서 접근하지 못하도록 private 접근제한자 사용
      private static Manager manager = new Manager();
      
      // 클래스 내부에서 생성자 호출 함수를 접근 못하도록 private으로 제한
      private Manager() {};
      
      //getManager을 통해 manager 객체 접근 가능하며, 신규 객체는 생성 불가능
      public static Manager getManager(){
        return manager;
      }
    }

    [ 참고: Singeton VS static class ]

    Singleton static class
    인스턴스(객체) 생성 인스턴스(객체) 생성하지 않음
    생성자 활용 생성자 없음
    인스턴스로 접근 클래스명으로 접근

    6-11. final 필드와 상수

    6-11-1. final 필드

    final 필드는 초기값이 저장되면 이것이 최종값이 되어 프로그램 실행 도중에 수정할 수 없다는 것을 의미

    // final field 값 초기화 방법
    
    public class Person {
      final String nation = "Korea";		// 1. 선언과 동시에 초기화
      final String ssn;
      String name;
      
      public Person(String ssn, String name) {
        this.ssn = ssn;				// 2. 객체 생성시 초기화
        this.name = name;
      }
    }
    
    public class PersonTest {
      public static void main(String[] args) {
        Person p1 = new Person("123456-1234567", "에린");
        
        System.out.println(p1.nation);
        System.out.println(p1.ssn);
        System.out.println(p1.name);
        
      }
    }

    6-11-2. 상수 (static final)

    상수는 static이면서 final인 값이며, 클래스에만 포함되고 한 번 초기값이 저장되면 변경할 수 없음

    - final field != static final, final 필드는 객체마다 저장되고 생성자의 매개값을 통해 여러 가지 값을 가질 수 있음

    - 선언과 동시에 초기화를 해주는 것이 일반적이지만, 복잡한 초기화의 경우 정적 블록에서도 초기화 가능

    - 상수 이름은 모두 대문자로 작성하는 것이 관례이며 혼합명의 경우 ( _ )로 단어를 연결

    // Earth.java
    public class Earth {
      static final double EARTH_RADIUS = 6400;
      static final double EARTH_SURFACE_AREA;
      
      static {
        EARTH_SURFACE_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
      }
    }
    
    // EarthTest.java
    public class EarthTest {
      public static void main(String[] args) {
        System.out.println("지구의 반지름: " + Earth.EARTH_RADIUS + " km");
        System.out.println("지구의 표면적: " + Earth.EARTH_SRUFACE_AREA + " km^2");
      }
    }

     

    반응형

    댓글

Designed by Tistory.