교재 : JAVA 프로그래밍 기초 - 15. 클래스멤버와 인스턴스멤버

+ 자바의 정석[기초편]

# 클래스 멤버 

클래스 멤버란? 클래스 메소드 & 클래스 변수 (static이 붙은 메소드나 변수)

- 클래스와 관련된 멤버

- static 수식자가 붙은 클래스 멤버는 객체를 생성하지 않고 멤버에 액세스가 가능하다.

- 각 객체들의 공통의 멤버가 되기 때문에 클래스 전체로 취급해야 하는 데이터나 조작 등을 클래스 멤버로 둔다.

- 클래스 멤버는 정적 멤버라고도 부른다.

- 클래스 변수에는 this 키워드는 사용할 수 없다. (인스턴스 변수만 가능)

- 클래스 메소드 내에서 인스턴스 멤버는 액세스가 불가능하다.

· 클래스 변수 : 모든 인스턴스가 하나의 저장공간을 공유하므로, 항상 공통된 값을 갖는다. (공통 속성)

 

[클래스 멤버 정의]

static 키워드가 붙는 것이 포인트!

public class 클래스명 { 
   (접근제한자) static 자료형 필드변수; 
   ... 
   (접근제한자) static 리턴자료형 메소드명(인수) 
}

 

 

 

 

# 인스턴스 멤버 

인스턴스 멤버란? 인스턴스 메소드 & 인스턴스 변수 (static이 붙지 않은 메소드나 변수)

 - 객체와 연관된 멤버

- 클래스 내에서 필드 변수에 값을 저장하거나 메소드를 호출할 수 있다.

- 객체를 생성하지 않는 한 멤버에 액세스 할 수 없다.

- 인스턴스 메소드 내에서 클래스 멤버 액세스가 가능하다.

· 인스턴스 변수 : 인스턴스가 생성될 때마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있음. (개별 속성)

 

 

[인스턴스 멤버 정의]

그동안 정의해 왔던 기존 클래스와 같다.

public class 클래스명 {
   (접근제한자) 자료형 필드변수;
   ...
   (접근제한자) 리턴자료형 메소드명(인수)
}

 

 

 

[예제] 클래스 멤버와 인스턴스 멤버 사용하기

package jokun.chap15;

class Computer2 {
    private String os; // 인스턴스 변수
    private int memory; // 인스턴스 변수
    public static int sum; // 클래스 변수

    // 생성자
    public Computer2() {
        this.os = null;
        this.memory = 0;
        sum++;
        System.out.println("PC를 만들었습니다.");
    }
    public void setOsMemory(String os, int memory) { // 인스턴스 메소드
        this.os = os;
        this.memory = memory;
        System.out.println("OS는 " + os + "이고 메모리는 「" + memory + "GB로 변경했습니다.");
    }
    public void show() { // 인스턴스 메소드
        System.out.println("PC의 OS는 " + os + "입니다.");
        System.out.println("메모리는 " + memory + "GB입니다.");
    }
    public static void showSum() { // 클래스 메소드
        System.out.println("PC 제작된 갯수는 " + sum + "대입니다.");
    }
}

public class ClassMember {
    public static void main(String[] args) {
        Computer2.sum = 0; // 클래스 변수 sum에 액세스하고 0으로 초기화
        Computer2.showSum(); // 클래스 메소드 showSum에 액세스 1회 (객체 작성 전)

        Computer2 com1 = new Computer2();
        com1.setOsMemory("Windows 11", 64);
        com1.show();
        Computer2.showSum(); // 클래스 메소드 showSum에 액세스 2회 (com1객체 작성 후)

        Computer2 com2 = new Computer2();
        com2.setOsMemory("Windows 10", 8);
        com2.show();
        Computer2.showSum(); // 클래스 메소드 showSum에 액세스 3회 (com1, com2객체 작성 후)
    }
}

com1.show();과 com2.show();도 인스턴스 메소드 액세스함

▽ 실행 화면 ▽

 

 

 


 

 

# 연습문제

더보기

15-4. 연습문제

<질문 1> 다음의 질문 ①~⑤에 대해 ○인가×로 대답하십시오.

① 클래스의 멤버인 필드와 메소드는 인스턴스 멤버 또는 클래스 멤버로 분류할 수 있다. O
② 인스턴스 멤버에게는 객체를 생성하여 처음으로 액세스가 가능해진다. O
③ 인스턴스 메소드로부터 클래스 멤버에 액세스는 불가능. X
④ 객체를 생성하면 클래스 멤버도 객체와 연관된다. X
⑤ 클래스 메소드로부터 인스턴스 멤버에 액세스 가능. X

 

<질문 2> 이하의 사양을 가지는 Books1.java 클래스를 정의해 주세요.

필드 변수:액세스 수식자는 모두 「private」로 한다
① 클래스 변수 int형 count 0으로 초기화
② 인스턴스 변수 String형 title 초기화 없음
③ 인스턴스 변수 int형 price 초기화 없음
④ 인스턴스 변수 int형 number 초기화 없음

생성자
인수: String 형 title, int 형 price
처리: 클래스 변수의 count를 인크리먼트 (1 증가) 합니다.
인수의 값을 같은 이름의 필드 변수에 각각 포함합니다.
필드 변수 number에 클래스 변수 count의 값을 대입합니다.

 

package chap15Excercise;

public class Book1 {
   // 필드변수 4개 정의

  // 생성자 정의
}
package jokun.chap15;

public class Books1 {

    private static int count = 0;
    private String title;
    private int price;
    private int number;

    public Books1(String title, int price){
        ++count;
        this.title = title;
        this.price = price;
        this.number = count;

    }

}

 

 

<질문 3> 문제2에서 작성한 Book1.java에, 이하의 사양을 가지는 2개의 메소드를 추가한 Book2.java를 작성해 주세요.

① 메소드 사양: 메소드의 액세스 수식자는 모두 「public」으로 하는
메소드명:showBook(인스턴스 메소드)
반환값: 없음
인수: 없음
처리 내용: 이하의 메세지를 화면에 출력한다. ※title, price, number는 필드 변수입니다.
“이 책의 제목은 title, 가격은 price입니다.”
“생성 번호는 number입니다.”

package chap15exercise;

public class Books2 {
   // Book1 정의
   // showBank메소드 정의
   // getCount 메소드 정의
}
package jokun.chap15;

public class Books2 {

    private static int count = 0;
    private String title;
    private int price;
    private int number;

    public Books2(String title, int price){
        ++count;
        this.title = title;
        this.price = price;
        this.number = count;

    }

    public void showBook() {
        System.out.println("이 책의 제목은 " + this.title + "가격은 " + this.price + "입니다.");
        System.out.println("생성 번호는 " + this.number + "입니다.");
    }
    public static int getCount(){
        return count;
    }
}

 

 

 

<질문4> 질문3에서 만든 Book2.java를 복사하고 Book3 클래스를 만들고 다음 실행 결과가되도록 Practice1502.java를 만듭니다.

Practice1502클래스의 main 메소드 사양
① 키보드 입력용 클래스 Scanner 클래스를 오브젝트화한다. ※2
② 3회 반복하는 for문을 기술한다.
③ 키보드에서 책 제목을 입력합니다. ※1
④ 키보드에서 책의 가격을 입력한다. ※1
⑤ ③과 ④로 입력한 값을 인수로 Book3형의 오브젝트를 생성한다. ※1
⑥ Book3형 오브젝트의 인스턴스 멤버인 showBook ​​메소드에 액세스한다. ※1
⑦ Book3 클래스 멤버인 getCount 메소드를 이용하여 화면에 책의 총 생성 횟수를 표시한다. ※2
※1:②의 반복처리내에서 처리를 실시한다. ※2:②의 반복처리 밖에서 처리를 실시한다.

package chap15Excercise;

import java.util.Scanner;

class Book3 {
    // 앞에서 다룬 내용을 입력 
}

public class Practice1502 {
    public static void main(String[] args) {
        // ① 스캐너 클래스를 인스턴스화 
        // ② 3회 반복 처리
        {
            // ③ 제목 입력 
            System.out.print("책 제목 입력: ");
            String title = sin.next();

            // ④ 가격 입력
            System.out.print("책 가격 입력: ");
            int price = sin.nextInt();

            // ⑤ 키보드 입력에서 값을 인수로 객체 생성 
            // ⑥ 책정보 표시
            // 줄바꿈 
            System.out.println();
        }

        // ⑦ 객체 생성 횟수 표시
    }
}
package jokun.chap15;

import java.util.Scanner;

class Books3 {

    private static int count = 0;
    private String title;
    private int price;
    private int number;

    public Books3(String title, int price){
        ++count;
        this.title = title;
        this.price = price;
        this.number = count;

    }

    public void showBook() {
        System.out.println("이 책의 제목은 " + this.title + "가격은 " + this.price + "입니다.");
        System.out.println("생성 번호는 " + this.number + "입니다.");
    }
    public static int getCount(){
        return count;
    }
}

public class Practice1502 {
    public static void main(String[] args) {
        // ① 스캐너 클래스를 인스턴스화
        Scanner sc = new Scanner(System.in);
        // ② 3회 반복 처리
        for(int i = 0; i < 3; i++){

            // ③ 제목 입력
            System.out.print("책 제목 입력: ");
            String title = sc.next();

            // ④ 가격 입력
            System.out.print("책 가격 입력: ");
            int price = sc.nextInt();

            // ⑤ 키보드 입력에서 값을 인수로 객체 생성
            Books3 book = new Books3(title, price);

            // ⑥ 책정보 표시
            book.showBook();

            // 줄바꿈
            System.out.println();
        }

        // ⑦ 객체 생성 횟수 표시
        System.out.println("책 생성횟수 " + Books3.getCount());
    }
}

 

 

복사했습니다!