인스턴스 멤버
인스턴스 멤버 선언 및 사용
- 인스턴스 멤버 : 필드와 메소드 등 객체에 소속된 멤버
this 키워드
- 객체 내부에서는 인스턴스 멤버에 접근하기 위해 this를 사용. 객체는 자신을 'this'라고 지칭
- 생성자와 메소드의 매개변수명이 인스턴스 멤버인 필드명과 동일한 경우, 인스턴스 필드임을 강조하고자 할 때 this를 주로 사용
정적 멤버
정적 멤버 선언
- 정적 멤버 : 메소드 영역의 클래스에 고정적으로 위치하는 멤버
- static 키워드를 추가해 정적 필드와 정적 메소드로 선언
public class 클래스 {
//정적 필드 선언
static 타입 필드 [= 초기값];
// 정적 메소드
static 리턴타입 메소드(매개변수, ...) {...}
}
정적 멤버 사용
- 클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할 수 있음
- 클래스 이름과 함께 도트(.) 연산자로 접근
public class CalcuatorExample {
static double pi = 3.14159;
static int plus(int x, int y) {
return x + y;
}
static int minus(int x, int y) {
return x - y;
}
}
- 정적 필드와 정적 메소드는 객체 참조 변수로도 접근
정적 블록
- 정적 필드를 선언할 때 복잡한 초기화 작업이 필요하다면 정적 블록을 이용
- 정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행
- 정적 블록이 클래스 내부에 여러 개가 선언되어 있을 경우에는 선언된 순서대로 실행
- 정적 필드는 객체 생성 없이도 사용할 수 있기 때문에 생성자에서 초기화 작업을 하지 않음
인스턴스 멤버 사용 불가
- 정적 메소드와 정적 블록은 내부에 인스턴스 필드나 인스턴스 메소드를 사용할 수 없으며 this 도 사용할 수 없음
- 정적 메소드와 정적 블록에서 인스턴스 멤버를 사용하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근
static void method3 {
//객체 생성
ClassName obj = new ClassName();
// 인스턴스 멤버 사용
obj.field1 = 10;
obj.method1();
final 필드와 상수
final 필드 선언
- final 필드는 초기값이 저장되면 최종적인 값이 되어서 프로그램 실행 도중에 수정할 수 없게 됨
- final 필드에 초기값을 주려면 필드 선언 시에 초기값을 대입하거나 생성자에서 초기값을 대입
final 타입 필드 [=초기값];
상수 선언
- 상수 : 불변의 값을 저장하는 필드
- 상수는 객체마다 저장할 필요가 없고, 여러 개의 값을 가져도 안되기 때문에 static이면서 final
static final 타입 상수 [=초기값];
패키지
자바의 패키지
- 클래스의 일부분이며, 클래스를 식별하는 용도
- 패키지는 주로 개발 회사의 도메인 이름의 역순으로 만듦
- 상위 패키지와 하위 패키지를 도트(.)로 구분
- 패키지에 속한 바이트코드 파일(~.class)은 따로 떼어내어 다른 디렉토리로 이동할 수 없음
패키지 선언
- 패키지 선언은 package 키워드와 함께 패키지 이름을 기술한 것, 항상 소스 파일 최상단에 위치
package 상위패키지. 하위패키지;
public class 클래스명 { ... }
- 패키지 이름은 모두 소문자로 작성. 패키지 이름이 서로 중복되지 않도록 회사 도메인 이름의 역순으로 작성하고, 마지막에는 프로젝트 이름을 붙여줌
com.samsung.projectname
com.lg.projectname
org.apache.projectname
Improt 문
- 다른 패키지에 있는 클래스를 사용하려면 import 문을 이용해서 어떤 패키지의 클래스를 사용하는지 명시
package com.mycompany;
import com.hankook.Tire;
public class Car {
//필드 선언 시 com.hankook.Tire 클래스를 사용
Tire tire = new Tire();
}
- import 문은 패키지 선언과 클래스 선언 사이에 작성. import 키워드 뒤에는 사용하고자 하는 클래스의 전체 이름을 기술
접근 제한자
접근 제한자
- 중요한 필드와 메소드가 외부로 노출되지 않도록 해 객체의 무결성을 유지하기 위해서 접근 제한자 사용
- 접근제한자는 public, protected, private의 세가지 종류
클래스의 접근 제한
- 클래스를 선언할 때 public 접근 제한자를 생략하면 클래스는 다른 패키지에서 사용할 수 없음
- 클래스를 선언할 때 public 접근 제한자를 붙이면 클래스는 같은 패키지뿐만 아니라 다른 패키지에서도 사용할 수 있음
생성자의 접근 제한
- 생성자는 public, default, private 접근 제한을 가질 수 있음
public class ClassName{
//생성자 선언
[public | private] ClassName(...) { ...}
}
접근 제한자 | 생성자 | 설명 |
public | 클래스(...) | 모든 패키지에서 생성자를 호출할 수 있다. = 모든 패키지에서 객체를 생성할 수 있다. |
클래스(...) | 같은 패키지에서만 생성자를 호출할 수 있다. =같은 패키지에서만 객체를 생성할 수 있다. |
|
private | 클래스(...) | 클래스 내부에서만 생성자를 호출할 수 있다. = 클래스 내부에서만 객체를 생성할 수 있다. |
필드와 메소드의 접근 제한
- 필드와 메소드는 public, default, private 접근 제한을 가질 수 있음
// 필드 선언
[ public | private ] 타입 필드;
//메소드 선언
[ public | private ] 리턴타입 메소드(...) {...}
접근 제한자 | 생성자 | 설명 |
public | 필드 메소드(...) |
모든 패키지에서 필드를 읽고 변경 할 수 있다. 모든 패키지에서 메소드를 호출 할 수 있다. |
필드 메소드(...) |
같은 패키지에서만 필드를 읽고 변경 할 수 있다, 같은 패키지에서만 메소드를 호출 할 수 있다,. |
|
private | 필드 메소드(...) |
클래스 내부에서만 필드를 읽고 변경 할 수 있다. 클래스 내부에서만 메소드를 호출 할 수 있다. |
Getter와 Setter
Setter
- 데이터를 검증해서 유효한 값만 필드에 저장하는 메소드
Getter
- 필드값이 객체 외부에서 사용하기에 부적절한 경우, 적절한 값으로 변환해서 리턴할 수 있는 메소드
private 타입 fieldName;
//Getter
public 타입 getFieldName() {
return fieldName;
}
//Setter
public void setFieldName(타입 fieldName) {
this.fieldName = fieldName;
}
Getter와 Setter
객체의 필드(데이터)를 외부에서 마음대로 읽고 변경할 경우 객체의 무결성(결점이 없는 성질)이 깨질수 가있다.
ex) 자동차의 속력은 음수가 될 수 없는데, 외부에서 음수로 변경하면 객체의 무결성이 깨진다.
Car myCar = new Car() ;
myCar.speed = -100;
객체 지향 프로그래밍에서는 직접적인 외부에서의 필드 접근을 막고 대신 메소드를 통해 필드에 접근하는 것을 선호한다,
private double speed;
private : 같은 클래스 내부에서는 접근 가능
setter를 통해서 같은 내부에 있는 private 필드에 접근해서 값을 변경
getter를 통해서 같은 내부에 있는 private 필드에 접근해서 값을 가져온다
public void setSpeed(double speed) {
if (speed < 0) {
this.speed = 0;
return;
} else {
this.speed = speed;
}
}
public double getSpeed() { // speed 가 마일로 되어 있을때 km 환산
double km = speed * 1.6;
return km;
}
싱글톤 패턴
싱글톤 패턴
- 생성자를 private 접근 제한해서 외부에서 new 연산자로 생성자를 호출할 수 없도록 막아서 외부에서 마음대로 객체를 생성하지 못하게 함
- 대신 싱글톤 패턴이 제공하는 정적 메소드를 통해 간접적으로 객체를 얻을 수 있음
public class 클래스 {
// private 접근 권한을 갖는 정적 필드 선언과 초기화
private static 클래스 singleton = new 클래스 () ;
// private 접근 권한을 갖는 생성자 선언
private 클래스() {}
//public 접근 권한을 갖는 정적 메소드 선언
public static 클래스 getInstance() {
return singleton;
}
}
싱글톤 패턴
애플리케이션 전체에서 단 한 개의 객체만 생성해서 사용하고 싶다면 싱글톤(singleton) 패턴을 적용할 수 있다.
싱글톤 패턴의 핵심은 생성자를 private 접근 제한해서 외부에서 new 연산자로 생성자를 호출 할 수 없도록 막는 것이다.
'자바' 카테고리의 다른 글
자바 - 인터페이스 (0) | 2023.01.16 |
---|---|
자바 - 상속 (0) | 2023.01.12 |
자바 - 클래스 - 01 (0) | 2023.01.10 |
자바 - 참조 타입 (0) | 2023.01.09 |
자바 - 조건문과 반복문 (0) | 2023.01.06 |