-
[Java 자바] 6. 클래스 ④ this, static, final, static finalProgramming/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"); } }
반응형'Programming > Java' 카테고리의 다른 글
[Java 자바] 6. 클래스 ⑥ 접근 제한자 (public, protected, default, private), Getter/Setter, 어노테이션 (0) 2022.07.31 [Java 자바] 6. 클래스 ⑤ 패키지 (0) 2022.07.31 [Java 자바] 6. 클래스 ③ 필드, 생성자, 메소드 (0) 2022.07.31 [Java 자바] 6. 클래스 ② 클래스 선언, 객체 생성 (0) 2022.07.31 [Java 자바] 6. 클래스 ① 객체지향 프로그래밍, 객체와 클래스 (0) 2022.07.30