본문 바로가기
Web

[Java] 클래스 변수와 인스턴스 변수의 차이

by DuncanKim 2022. 6. 13.
728x90

[Java] 클래스 변수와 인스턴스 변수의 차이

S클래스 상속받고 싶다

 

객체 지향에서 가장 중요한 클래스와 상속.

클래스는 정말 기본 중에 기본이다.

 

상속에서 클래스를 비유해보았는데 참고하면 좋을 것이다.

2022.06.13 - [프로그래밍 언어/Java] - [Java] 상속 inheritance 을 활용한 정보관리 시스템 만들기

 

[Java] 상속 inheritance 을 활용한 정보관리 시스템 만들기

[Java] 상속 inheritance 을 활용한 정보관리 시스템 만들기 상속은 객체 지향에서 중요한 개념이다. 매번 클래스에 같은 내용을 넣지 않고, 기존의 클래스에 추가하고 싶은 내용이 있는데, 각기 다른

masterpiece-programming.tistory.com

 

클래스를 여러 개 쓰면서 전국의 아빠들이 만드는 다 때려 넣는 비빔밥 같았던 코드를 뷔페식으로 바꾸어 놓을 수 있다.

 

아래의 코드는 자료구조에서 쓰이는 노드 클래스를 구현해놓은 것이다.

클래스에서 가장 중요한 개념인 인스턴스 변수와 클래스 변수의 개념을 구분해서 알아야 한다.

 

 

1. 두 점의 x, y값을 주고, 두 점 사이의 중앙값을 구하는 코드(노드 클래스, 메인 클래스 구현)

 

(1) 노드 클래스

public class Node {
	// private : 외부에서 함부로 접근할 수 없는 상태. get, set으로만 변수에 접근할 수 있도록 해 주는 것이다.
	private int x;
	private int y;
    
	//생성자. 클래스와 동일한 이름을 가지고 있다.
	public Node(int x, int y) {
		this.x = x;
		this.y = y;
	}	
    
	public int getX() {
		return x;
	}

	//매개변수로 넘어온 값을 이 클래스의 x값으로 바꾸겠다.
	public void setX(int x) {
		this.x = x;
	}

	public int getY() {
		return y;
	}
	
	//매개변수로 넘어온 값을 이 클래스의 x값으로 바꾸겠다.
	public void setY(int y) {
		this.y = y;	
	}

	// 정중앙값 반환 함수(노드를 타입형으로 함)	
	public Node getCenter(Node other) {
		return new Node((this.x + other.getX()) / 2, (this.y + other.getY()) / 2);
	}
}

노드 클래스에는 int x, y 라는 인스턴스 변수와 생성자와 get, set 함수, getCenter라는 함수가 담겨 있다.

 


인스턴스 변수

: 인스턴스가 생성되었을 때 사용하는 변수


인스턴스 변수와 혼동되는 개념은 클래스 변수이다.

클래스 변수는 static을 사용하는데, 어떤 인스턴스를 사용하든 static 변수는 공유된다.

 

아래 메인 클래스에서 각각 다른 인스턴스를 만들어 one, two에 저장했는데,

인스턴스 변수는 one의 경우 (10, 20)이 되는 것이고, two의 경우 (30, 40)이 되는 것이다.

그럼 각자 다른 변수를 가지고 생성자를 통해 x, y가 변경되어 클래스의 메소드들을 불러온다.

 

그런데 static으로 된 클래스 변수로 int x, y를 선언한다면 어떻게 될까.

아래의 메인 클래스로 따지자면, 결과적으로 one, two 둘 다 x, y값을 30, 40으로 가지게 될 것이다.

인스턴스의 변수가 아니라 노드 클래스 자체의 변수가 변경되기 때문에, one, two 둘 다 x, y값을 30, 40으로 가지게 되는 것이다.

 

 

유튜브 생활코딩 자바 객체지향프로그래밍 중 static 강의 캡쳐

클래스 이름이 달라서 그렇지만, 저런 화살표의 방식처럼 클래스 변수와 static 함수는 인스턴스 공통으로 공유가 된다.

그렇지만 인스턴스 변수와 static이 아닌 함수는 인스턴스 각자 할당을 받게 되고 자유롭게 쓸 수 있다.


클래스 변수는 공유

인스턴스 변수는 복제


가 된다고 생각하면 된다.

공유가 되는 경우, 계속해서 실시간으로 바뀌면 변형이 되는 것이고,

복제가 된 경우, 복제되고 나서 변형이 되어도 원본에는 영향을 미치지 않는 것과 같다.

 

 

한편 생성자의 경우 인스턴스 변수로 받아들인 int x, y를 초기값으로 설정해주고 각 메소드 별로 변수를 사용할 수 있게 하는

역할을 담당한다.

this 라는 키워드를 사용하는데, 지금의 인스턴스 변수의 값을 매개변수로 들어온 x, y값으로 바꾸겠다는 의미이다.

 

 

 

 

(2) 메인 클래스

public class Main {

	public static void main(String[] args) {
		Node one = new Node(10, 20);
		Node two = new Node(30, 40);
		Node result = one.getCenter(two);
		System.out.println("x : " + result.getX() + ", y : " + result.getY()) ;
	}

}//결과 : x : 20, y : 30

노드 클래스의 인스턴스 두 개를 만들어서 x, y값을 매개변수로 집어 넣는다.

그리고 getCenter를 통해서 두 점 사이의 결과값을 도출한다.

result는 getCenter의 x, y값을 담고 있는 노드 클래스의 인스턴스가 담긴 변수가 되는 것이다.

 

result의 x, y 키를 불러오면 중앙 값을 반환 할 수 있다.

 

 

728x90

'Web' 카테고리의 다른 글

[Java] 추상, 인터페이스  (0) 2022.06.13
[Java] 상속 inheritance 을 활용한 정보관리 시스템 만들기  (0) 2022.06.13
[Java] Java 자바 final  (0) 2022.06.13
[Java] 배열, 다차원 배열  (0) 2022.06.13
[Java] 원 찍기  (0) 2022.06.13

댓글