티스토리 뷰
정적(Static) 멤버
정적 멤버는 클래스에 고정된 멤버이다.
객체를 생성하지 않고 사용할 수 있는 필드와 메소드를 각각 정적 필드와 정적 메소드라고 부른다.
정적 멤버 선언
public class 클래스{
//정적 필드
static 타입 필드
//정적 메소드
static 리턴 타입 메소드 (매개변수) { ... }
}
정적 필드와 정적 메소드는 클래스에 고정된 멤버이므로 클래스 로더가 클래스를 로딩해서 메소드 메모리 영역에 적재할 때 클래스별로 관리된다.
클래스의 로딩이 끝나면 바로 사용할 수 있다.
그 후, 정적 멤버는 클래스 이름과 함께 도트( . ) 연산자로 접근 가능하다.
클래스.필드;
클래스.메소드(매개값);
정적 필드는 다음과 같이 필드 선언과 동시에 초기값을 주는 것이 보통인데,
계산이 필요한 초기화 작업이 있을 수 있으므로, 정적 블록(static block)을 제공한다.
정적 블록의 형태는 다음과 같다.
static {
...
}
정적 메소드와 블록 선언 시, 정적 메소드와 정적 블록 내부에 정적(static)멤버가 아닌 필드와 메소드를 사용 할 수 없다.
또한, this 키워드의 사용이 불가하다.
이러한 이유는 정적멤버는 객체가 없어도 사용가능하기 때문이다.
다음 코드는 정적멤버의 사용 예이다.
Shape.java
public class Shape {
//정적 필드
static double pi = 3.14;
static String subject = "MATH";
static String language = "JAVA";
static String shapeType;
static String info;
static double Area;
//정적 초기화 블록
static {
info = subject + " - " + language;
}
//정적 메소드
static String circle(int x) {
// TODO Auto-generated constructor stub
Area = x*x*pi;
shapeType = "Circle";
return Double.toString(Area)+" ("+shapeType+")";
}
static String triangle(int x, int y) {
Area = x*y*0.5;
shapeType = "Triangle";
return Double.toString(Area)+" ("+shapeType+")";
}
static void info() {
System.out.println(info);
}
}
ShapeEx.java
public class ShapeEx {
public static void main(String[] args) {
// TODO Auto-generated method stub
//정적 메소드 호출
String triangle = Shape.triangle(3, 9);
String circle = Shape.circle(2);
Shape.info();
System.out.println("Area: "+triangle);
System.out.println("Area: "+circle);
}
}
인스턴스(Instance) 멤버
인스턴스 멤버란 객체(인스턴스)를 생성한 후 사용할 수 있는 필드와 메소드를 말한다.
정적 멤버가 아닌 것을 인스턴스 멤버라고 생각해도 무방하다.
인스턴스 멤버들은 객체에 소속된 멤버이므로 객체 없이는 사용할 수 없다는 것을 꼭 기억해두어야 한다.
인스턴스 필드는 객체마다 따로 존재하고, 인스턴스 메소드는 객체마다 존재하는 것이 아닌 메소드 영역에 저장되고 공유된다.
정적 멤버와는 다르게, 객체 내부에서 인스턴스 멤버에 접근하기 위해 this를 사용할 수 있다.
인스턴스 필드 및 메소드 예시 코드는 다음과 같다.
(우리가 여태 사용해 왔던 메소드와 필드들은 모두 인스턴스 멤버이다.)
Building.java
public class Building {
// 인스턴스 필드
int year;
String company;
// 생성자
Building(String company, int year) {
this.company = company; // 필드 company를 매개변수 company로 초기화한다.
this.year = year; // 필드 height를 매개변수 height로 초기화한다.
}
// 인스턴스 메소드
int getYear() {
return year;
}
void getInfo() {
System.out.println("빌딩정보");
System.out.println("건설사:"+this.company);
System.out.println("건설년도:"+getYear());
System.out.println("지어진지 "+ (2019-getYear()-1) +"년 됏습니다.");
System.out.println("");
}
}
BuildingEx.java
public class BuildingEx {
public static void main(String[] args) {
Building building1 = new Building("현대",2000); // 객체 생성
Building building2 = new Building("삼성",1998); // 객체 생성
building1.getInfo();
building2.getInfo();
}
}
'JAVA' 카테고리의 다른 글
접근제한자(Access Modifier) (0) | 2019.09.16 |
---|---|
싱글톤(Singleton) (0) | 2019.09.16 |
클래스 구성 멤버들의 사용 및 오버로딩 (0) | 2019.09.11 |
클래스의 구조 (0) | 2019.09.10 |
객체와 클래스 (0) | 2019.09.10 |