[지코바] 클래스 멤버와 인스턴스 멤버

[지코바] 클래스 멤버와 인스턴스 멤버

클래스 멤버, 인스턴스 멤버

출처 : 유튜브 생활코딩 Java - 클래스 맴버, 인스턴스 맴버 (1/4) : 맴버란? #

Java - 클래스 맴버, 인스턴스 맴버 (2/4) : 클래스 변수 #

Java - 클래스 맴버, 인스턴스 맴버 (3/4) : 클래스 메소드 #

Java - 클래스 맴버, 인스턴스 맴버 (4/4) : 타입별 비교 #

# Member 멤버 (구성원)

- 객체도 구성원이 있다.

인스턴스의 소유가 아니고 클래스의 소유인 변수가 존재하다. 그리고 클래스의 소유인 변수는 인스턴스의 소유인 변수와 다른 특성을 가지고 있다. 즉, 인스턴스의 소유가 아니고 클래스의 소유!

객체를 만들기 위해서는 클래스를 정의하고 -> 클래스에 대한 인스턴스를 만들었다 (도연님의 설명을 참고하자). 따라서 해당 인스턴스는 변수를 갖고 있고, 이 변수들은 인스턴스의 멤버다. 그렇다면 클래스는?

클래스도 변수와 메소드라는 구성원(멤버)을 가질 수 있다.

# 클래스 변수

인스턴스의 상태인 변수의 값이 인스턴스마다 다른 값을 가질 수 있다는 점은 하나의 클래스를 여러개의 인스턴스로 만들어서 사용할 수 있다는 점에서 좋은 기능이다. 하지만, 경우에 따라 모든 인스턴스가 같은 값을 공유하고 싶을 때가 있다.

예제를 참고하자.

우리는 계산기에 [원주율 3.14] 값을 기억하도록 두고 싶다. 하지만 객체마다 다른 값을 가질 필요는 없다. 원주율 3.14는 정해져있기 때문이다.

package org.opentutorials.javatutorials.classninstance; class Calculator { static double PI = 3.14; int left, right; public void setOprands(int left, int right) { this.left = left; this.right = right; } public void sum() { System.out.println(this.left + this.right); } public void avg() { System.out.println((this.left + this.right) / 2); } } public class CalculatorDemo1 { public static void main(String[] args) { Calculator c1 = new Calculator(); System.out.println(c1.PI); Calculator c2 = new Calculator(); System.out.println(c2.PI); System.out.println(Calculator.PI); } }

여기서 중요하게 볼 점

static double PI = 3.14;

얼렐레? 변수 PI(파이) 앞에 static이 붙었네?

static을 멤버(변수, 메소드) 앞에 붙이게 되면 클래스의 멤버가 된다.

아래는 클래스 변수에 접근하는 두가지 방법이다. 참고하자.

// 인스턴스를 통해서 PI에 접근 System.out.println(c1.PI); // 클래스를 통해서 PI에 접근 System.out.println(Calculator.PI);

클래스 변수는 변수의 변경사항을 모든 인스턴스에서 공유해야 할 때도 사용한다.

계산기 예제로 다시 들면, 계산을 할 때 특별한 값을 포함시켜야 될 때를 들 수 있다.

package org.opentutorials.javatutorials.classninstance; class Calculator2 { static double PI = 3.14; // 클래스 변수인 base가 추가되었다. static int base = 0; int left, right; public void setOprands(int left, int right) { this.left = left; this.right = right; } public void sum() { // 더하기에 base의 값을 포함시킨다. System.out.println(this.left + this.right + base); } public void avg() { // 평균치에 base의 값을 포함시킨다. System.out.println((this.left + this.right + base) / 2); } } public class CalculatorDemo2 { public static void main(String[] args) { Calculator2 c1 = new Calculator2(); c1.setOprands(10, 20); // 30 출력 c1.sum(); Calculator2 c2 = new Calculator2(); c2.setOprands(20, 40); // 60 출력 c2.sum(); // 클래스 변수 base의 값을 10으로 지정했다. Calculator2.base = 10; // 40 출력 c1.sum(); // 70 출력 c2.sum(); } }

결과화면

30 60 40 70

클래스 변수의 용도 정리

1. 인스턴스에 따라서 변하지 않는 값이 필요한 경우 (위에 예제 원주율 참고)

2. 인스턴스를 생성할 필요가 없는 값을 클래스에 저장하고 싶은 경우

3. 값의 변경 사항을 모든 인스턴스가 공유해야 하는 경우

# 클래스 메소드

위에 예제 Calculator는 인스턴스 변수 left와 right를 이용해서 합계와 평균을 계산한다. 그러나 굳이 인스턴스가 left와 right의 값을 항상 유지하고 있어야 할 이유는 없다. 합계나 평균을 구할 때마다 좌항과 우항의 값을 주는 방식으로 계산할 수도 있는 것이다.

코드를 보자.

package org.opentutorials.javatutorials.classninstance; class Calculator3{ public static void sum(int left, int right){ System.out.println(left+right); } public static void avg(int left, int right){ System.out.println((left+right)/2); } } public class CalculatorDemo3 { public static void main(String[] args) { Calculator3.sum(10, 20); Calculator3.avg(10, 20); Calculator3.sum(20, 40); Calculator3.avg(20, 40); } }

일회용 물품처럼 한번만 사용하게 될 경우 클래스 소속의 메소드를 사용하면 된다!

# 멤버타입 비교

원칙 기억하기

1. 인스턴스 메소드는 클래스 멤버에 접근 할 수 없음

2. 클래스 메소드는 인스턴스 멤버에 접근 할 수 없음

-> 인스턴스 변수는 인스턴스가 만들어지면서 생성되는데, 클래스 메소드는 인스턴스가 생성되기 전에 만들어지기 때문에 클래스 메소드가 인스턴스 멤버에 접근하는 것은 존재하지 않는 인스턴스 변수에 접근하는 것과 같다.

용어 기억하기

1. 인스턴스 변수 : Non-Static Field

2. 클래스 변수 : Static Field

# 문제

클래스를 만들고 인스턴스로 생성한 후 해당 내용을 입력 받아 아래와 같은 형식으로 출력해보기.

+ 클래스 변수로 'wingardium' 추가해보기.

회사이름 : 주식회사 랩이오사

대표이름 : 이아영

주소 : 경기도 수원시 월드컵로 199, 407호

업태 : 정보통신업

직원 수 : 7명

주요 서비스 : 랩포인트, 허밍노트

from http://azerolee.tistory.com/26 by ccl(A) rewrite - 2021-11-12 15:01:58