※ static 에서 가장 중요한 개념 1) 탄생시점 - 클래스 변수 또는 클래스 메소드는 클래스 정보가 로딩되는 순간 메모리 할당이 이루어지며 클래스 이름 또는 객체(인스턴스)를 통해 접근할 수 있다. 즉,『new』연산자를 통해 메모리를 할당받지 않아도 사용이 가능하다. 2) 공유 - static 변수의 경우 클래스 내의 "공유 객체" 이다. (공용으로 사용되기 때문에, 해당 객체를 호출하여 사용/변경 하게 되면 그 값이 남아있게 된다)
Test100 - static 변수(클래스 변수)와 static 메소드(클래스 메소드) - static 변수,메소드 vs 인스턴스 변수,메소드 비교
/*=======================================================
■■■ 클래스와 인스턴스 ■■■
- static 변수(클래스 변수)와 static 메소드(클래스 메소드)
========================================================*/
// ※ 실습 편의상 접근제어 지시자 생략
public class Test100
{
static int a = 10; // staitc 변수 (클래스 변수, class 변수, 정적 변수)
int b = 20; // non-static 변수 (인스턴스 변수, instance 변수)
// ※ 인스턴스 변수 또는 인스턴스 메소드는
// 동일한 클래스의 메소드에서는 바로 접근하는 것이 가능하지만
// 클래스 메소드에서는 접근할 수 없다.
static void print() // static 메소드 (클래스 메소드, class 메소드, 정적 메소드)
{
//System.out.println("print()");
System.out.println("클래스 변수 a : " + a);
//System.out.println("인스턴스 변수 b : " + b);
}
void write() // non-static 메소드 (인스턴스 메소드, instance 메소드)
{
//System.out.println("write()");
System.out.println("클래스 변수 a : " + a);
System.out.println("인스턴스 변수 b : " + b);
}
public static void main(String[] args)
{
System.out.println("main() → 클래스 변수 a : " + Test100.a);
//-- 클래스 변수에 접근하기 위해서는
// 『클래스명.변수명』의 형태로
// 클래스의 이름을 통해 접근하는 것이 가능하다.
//--==>> main() → 클래스 변수 a : 10
System.out.println("main() → 클래스 변수 a : " + a);
//--==>> main() → 클래스 변수 a : 10
//-- 같은 클래스 내부에 존재하기 때문에...(같은 멤버)
// 클래스의 이름을 생략하는 것이 가능하다.
Test100.print();
//--==>> print()
//--==>> 클래스 변수 a : 10
print();
//--==>> 클래스 변수 a : 10
//-- 클래스 메소드에서 클래스 메소드의 호출은 가능하며
// 『클래스명.메소드명()』의 형태로 접근하여 호출하는 것이 가능하다.
// 또한, 지금과 같은 상황에서는 동일한 클래스 내부에 존재하기 때문에
// 클래스의 이름을 생략하여 호출한 경우에 해당한다.
//System.out.println("main() → 인스턴스 변수 b : " + b);
//--==>> 에러 발생(컴파일 에러)
//System.out.println("main() → 인스턴스 변수 b : " + b);
//--==>> 에러 발생(컴파일 에러)
//Test100.write();
//--==>> 에러 발생(컴파일 에러)
//write();
//--==>> 에러 발생(컴파일 에러)
// Test100 클래스 기반 인스턴스 생성
Test100 ob = new Test100();
//System.out.println("main() → 인스턴스 변수 b : " + b);
//--==>> 에러 발생(컴파일 에러)
//-- 인스턴스 변수에
// 생성된 인스턴스를 통해 접근하지 않아서 발생하는 에러
// 생성된 인스턴스를 통해 인스턴스 변수 접근
System.out.println("main() → 인스턴스 변수 b : " + ob.b);
//--==>> main() → 인스턴스 변수 b : 20
//write();
//--==>> 에러 발생(컴파일 에러)
//-- 인스턴스 메소드에
// 생성된 메소드에 접근하는 과정에서
// 생성된 인스턴스를 통하지 않아서 발생하는 에러
// 생성된 인스턴스를 통해 인스턴스 메소드 접근(호출)
ob.write();
//--==>> 클래스 변수 a : 10
// 인스턴스 변수 b : 20
// 생성된 인스턴스를 통해 클래스 변수 접근
System.out.println("main() → 클래스 변수 a : " + ob.a);
//--==>> main() → 클래스 변수 a : 10
// 생성된 인스턴스를 통해 클래스 메소드 접근(호출)
ob.print();
//--==>> 클래스 변수 a : 10
System.out.println("main() → 클래스 변수 a : " + a);
System.out.println("main() → 클래스 변수 a : " + Test100.a);
System.out.println("main() → 클래스 변수 a : " + ob.a);
//--==>> main() → 클래스 변수 a : 10
// main() → 클래스 변수 a : 10
// main() → 클래스 변수 a : 10
System.out.println(); // 개행
// Test100 클래스 기반 인턴스 생성
Test100 ob2 = new Test100();
ob2.a = 10000; // 클래스 변수 초기화
ob2.b = 20000; // 인스턴스 변수 초기화
System.out.println("ob2 확인 ~~~~~~~~~~~~~~~~~~~~~");
ob2.write();
//--==>> 클래스 변수 a : 10000
// 인스턴스 변수 b : 20000
System.out.println("ob 확인 ~~~~~~~~~~~~~~~~~~~~~~");
ob.write();
//--==>> 클래스 변수 a : 10000 // 공유의 기능
// 인스턴스 변수 b : 20
}
}
// 실행결과
/*
main() → 클래스 변수 a : 10
main() → 클래스 변수 a : 10
클래스 변수 a : 10
클래스 변수 a : 10
main() → 인스턴스 변수 b : 20
클래스 변수 a : 10
인스턴스 변수 b : 20
main() → 클래스 변수 a : 10
클래스 변수 a : 10
main() → 클래스 변수 a : 10
main() → 클래스 변수 a : 10
main() → 클래스 변수 a : 10
ob2 확인 ~~~~~~~~~~~~~~~~~~~~~
클래스 변수 a : 10000
인스턴스 변수 b : 20000
ob 확인 ~~~~~~~~~~~~~~~~~~~~~~
클래스 변수 a : 10000
인스턴스 변수 b : 20
계속하려면 아무 키나 누르십시오 . . .
*/
※ 클래스 변수나 클래스 메소드는 『생성된인스턴스명.변수명』 『생성된인스턴스명.메소드명』 의 형태로도 접근(호출)이 가능하지만 『클래스명.변수명』 『클래스명.메소드명()』 의 형태로 접근(호출)하는 것이 일반적이다.
Test101, Record, Sungjuk - 클래스와 인스턴스 활용 - 성적, 등수 계산 프로그램 구현하기
// 학생 별로 국어점수, 영어점수, 수학점수를 입력받아 총점, 평균을 계산하는 프로그램을 구현한다. // 단, 클래스의 개념을 활용하여 작성할 수 있도록 한다. // 또한, 이 과정에서 배열을 적극적으로 활용할 수 있도록 한다. // 클래스 설계는 다음의 가이드라인에 따라 진행할 수 있도록 한다.
// [※ 가이드라인] // 프로그램을 구성하는 클래스 // 1. Record 클래스 // - 속성만 존재하는 클래스로 설계할 것 // 2. Sungjuk 클래스 // - 인원 수를 입력받아, 입력받은 인원 수 만큼 이름, 국어점수, 영어점수, 수학점수를 입력받고 // 총점과 평균을 산출하는 클래스로 설계할 것 // ·속성 : 인원수, Record 타입의 배열(check) // ·기능 : 인원수입력, 상세데이터입력, 총점및평균연산, 결과출력 // 3. Test101 클래스 // - main() 메소드가 존재하는 외부 클래스로 설계할 것