Static Member(정적 변수)
1. 정적 변수 선언
각 인스턴스마다 따로 생성되는 변수가 아닌, 클래스 전반에서 공통으로 사용할 수 있는 기준 변수
클래스에서 공통으로 사용하는 변수
static int var1;
static 예약어를 사용하여 선언
static 변수는 클래스 내부에 선언하지만, 프로그램이 실행되어 메모리에 올라갔을 때, 딱 한 번 메모리 공간이 할당됨
그리고 그 값을 모든 인스턴스가 공유함(인스턴스가 같은 메모리를 가리킴)
static 변수는 method area(static area)에 저장됨
2. 정적 변수 접근
정적 변수에 사용할 때에는 class 이름 + dot(.) + 정적변수이름 으로 접근함
객체로도 접근할 수는 있지만, 추천하지 않음
public class Calculator {
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;
}
}
public class Main {
public static void main(String args[]) {
double result1 = 10 * 10 * Calculator.pi;
System.out.println(result1);
}
}
3. Static block
static {
// 정적 블록
}
클래스가 JVM에서 처음 로드될 때 실행 Java 클래스 내부의 명령문
주로 정적 필드의 복잡한 초기화에 사용됨
클래스가 인스턴스화 되기 전에 수행됨
클래스 내에 여러 정적 블록이 선언된 경우, 선언된 순서대로 실행
객체 인스턴스화 없이 사용할 수 있으므로, 생성자에서 초기화가 필요하지 않음
static class Student {
static String name = "홍길동";
static {
System.out.println("static...1");
name = "김길동";
}
static {
System.out.println("static...2");
name = "박길동";
}
}
Static 블록과 메소드 내에서는 인스턴스 변수를 사용할 수 없다!
인스턴스 변수를 사용하기 위해서는 먼저 인스턴스를 만들고, 이후 인스턴스의 멤버에 접근해야 한다.
(당연한 이야기...)
final field 상수(constant)
변하지 않는 값(immutable)
final 예약어를 사용해서 상수 값이 변하는 것을 막음
final + 타입 + 필드 [=초기값];
final double PI = 3.14;
상수는 각각의 객체에 저장될 필요가 없기 때문에 보통 static을 앞에 붙여서 정적 상수로 만든다.
// 상수 + 정적 변수
static final double PI = 3.14;
Java Packages
동일한 이름을 가진 클래스를 식별하는 데 사용, 클래스를 그룹화
일반적으로 자바 패키지는 회사나 개인의 도메인 이름을 역순으로 사용하여 생성됨
점(.)을 이용하여 상위 패키지와 하위 패키지로 분리하여 계층적 구성
패키지에 속하는 바이트코드 파일(.class)은 분리되어 다른 디렉토리로 이동할 수 없음
1. package 선언
pakage 키워드를 사용하여 선언
늘 소스파일의 맨 위에 있음
package 상위패키지.하위패키지;
public class 클래스명 {...}
패키지 이름은 소문자로 적힘
중복을 피하기 위해 패키지 이름은 회사 도메인 이름을 역순으로 작성하고, 마지막에 프로젝트 이름을 붙임
// 예시
com.samsung.projectname
2. Import
다른 패키지의 클래스를 사용하고 싶을 때 import 명령어를 사용하여 패키지를 특정지을 수 있음
패키지 선언과 클래스 선언의 중간에 적음
import 키워드 이후 가져오고자 하는 클래스의 full-name을 적음
// 예시
package com.mycompany; // mycompany 클래스의 패키지
package com.samsung.Smartphone; // smartphone 클래스의 전체 이름
public class phone {
Smartphone phone = new Smartphone();
}
Access Modigiers (접근 제어자)
중요한 필드와 메서드가 외부에 노출되는 것을 방지하여 객체의 무결성을 유지하는 데 사용
https://swlin23.tistory.com/7 : encapsulation 부분 참고
접근 제한자 | 설명 |
public | 외부 클래스 어디서나 접근 가능 제한 대상: 클래스, 필드, 생성자, 메소드 |
protected | 같은 패키지 내부와 상속 관계의 클래스에서만 접근할 수 있고, 그 외의 클래스에서는 접근할 수 없음 제한 대상: 필드, 생성자, 메소드 |
아무 것도 없는 경우 (default) | 같은 패키지 내부에서만 접근할 수 있음 제한 대상: 클래스, 필드. 생성자, 메소드 |
private | 같은 클래스 내부에서만 접근할 수 있음 제한 대상: 필드, 생성자, 메소드 |
1. 클래스에 대한 접근 제한
클래스는 public과 default 접근 제한을 지닐 수 있다.
- 클래스를 선언할 때 public 접근 제어자가 생략되면, 해당 클래스는 다른 패키지에서 접근할 수 없음
- 클래스를 선언할 때 public 접근 제어자를 추가하면, 해당 클래스는 동일한 패키지 뿐만 아니라 다른 패키지에서도 접근할 수 있음
2. 생성자에 대한 접근 제한
생성자는 public, protected, default, private 접근 제한을 지닐 수 있다.
public class ClassName1 {
// public으로 생성자 선언
public ClassName1(...) {...}
}
public class ClassName2 {
// private으로 생성자 선언
public ClassName2(...) {...}
}
- 생성자를 선언할 때 public을 사용하면 모든 패키지에서 생성자를 호출할 수 있고, 모든 패키지에서 객체를 생성할 수 있다.
- 생성자를 선언할 때 아무것도 붙이지 않으면 같은 패키지에서만 생성자를 호출할 수 있고, 같은 패키지에서만 객체를 생성할 수 있다.
- 생성자를 선언할 때 private를 붙이면 클래스 내부에서만 생성자를 호출할 수 있고, 클래스 내부에서만 객체를 생성할 수 있다.
3. 필드와 메서드에 대한 접근 제한
필드와 메서드는 public, protected, default, private 접근 제한을 지닐 수 있다.
// 필드 선언
public/private 타입 필드;
// 메소드 선언
public/private 리턴타입 메소드(...) {...}
- 필드와 메소드를 선언할 때 public을 사용하면 모든 패키지에서 필드를 읽고 변경할 수 있고, 모든 패키지에서 메소드를 호출할 수 있다.
- 필드와 메소드를 선언할 때 아무것도 적지 않으면 같은 패키지에서만 필드를 읽고 변경할 수 있고, 같은 패키지에서만 메소드를 호출할 수 있다.
- 필드와 메소드를 선언할 때 private을 사용하면 클래스 내부에서만 필드를 읽고 변경할 수 있고, 클래스 내부에서만 메소드를 호출할 수 있다.
Setter & Getter
setter: 유효한 값을 필드에 저장하는 메서드
getter: 필드의 값이 외부에서 접근하기 어려울 때에도 필드 값을 반환할 수 있도록 하는 메서드
private 타입 fieldName;
// Getter
public 타입 getFieldName() {
return fieldName;
}
// Setter
public void setFieldName(타입 fieldName) {
this.fieldName = fieldName;
}
'CS > Java' 카테고리의 다른 글
[Java] 상속 Inheritance - 3 (Type Conversion 형변환, Polymorphism 다형성) (0) | 2024.04.15 |
---|---|
[Java] 상속 Inheritance - 2 (Final Class, Final Method, protected 제어자) (0) | 2024.04.15 |
[Java] 상속 Inheritance - 1 (extends, super) (0) | 2024.04.06 |
[Java] Class 클래스 - 1 (field, constructor, method) (0) | 2024.04.03 |
[Java] Object-Oriented Programming 객체 지향 프로그래밍 (0) | 2024.04.03 |