티스토리 뷰

JAVA

정적 멤버와 인스턴스 멤버

Y.일월 2019. 9. 16. 11:27

정적(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
공지사항
최근에 올라온 글