
교재 : 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());
}
}
'Backend > JAVA' 카테고리의 다른 글
[JAVA] JAVA 프로그래밍 기초 교육 : 예외 처리 (0) | 2022.05.26 |
---|---|
[JAVA] JAVA 프로그래밍 기초 교육 : 패키지 & 임포트 (0) | 2022.05.26 |
[JAVA] JAVA 프로그래밍 기초 교육 : 생성자 & 오버로드 (0) | 2022.05.25 |
[JAVA] JAVA 프로그래밍 기초 교육 : 엑세스 한정자 & 캡슐화 (0) | 2022.05.25 |
[JAVA] JAVA 프로그래밍 기초 교육 : 객체 지향 & 클래스 (0) | 2022.05.24 |