2023.01.10 - [JAVA/Java 기초] - 객체, 클래스 변수.java
객체, 클래스 변수.java
객체 객체(object)란 물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것입니다. 객체는 속성과 동작으로 구성됩니다. 이러한 속성과 동작을 필드와 메소드라고 부릅니다. 객체
less-go.tistory.com
이어지는 내용입니다.
인스턴스 멤버 선언 및 사용
인스턴스 멤버 : 필드와 메소드등 객체에 소속된 멤버 입니다.

this 키워드
객체 내부에서는 인스턴스 멤버에 접근하기 위해 this 를 사용합니다. 객체는 자신을 'this'라고 지칭합니다.
생성자와 메소드의 매개변수명이 인스턴스 멤버인 필드명과 동일한 경우, 인스턴스 필드임을 강조하고자 할때 this를 주로 사용합니다.
//car 클래스 생성
public class Car {
//인스턴스 멤버 생성
String model;
int speed;
//메소드 생성
Car(String model){
this.model = model;
}
void setSpeed(int speed) {
this.speed = speed;
}
void run() {
this.setSpeed(100);
System.out.println(this.model + "가 달립니다.(시속 :" + this.speed + "km/h)");
}
}
실행 메소드 main 메소드
public class CarExam {
public static void main(String[] args) {
Car myCar = new Car("포르쉐");
Car yourCar = new Car("벤츠");
myCar.run();
yourCar.run();
}
}
인스턴스 멤버 : 객체가 생성되어야만 사용한 가능한 필드, 메소드
model, speed setSpeed();
run()
정적(Static)멤버 : 정적 멤버 선언만으로도 바로 사용 가능한 필드, 메소드
객체를 생성하더라도 같은 번지를 지칭하게 됩니다.
정적 멤버 사용
클래스가 메모리로 로딩되면 정적 멤버를 바로 사용할수 있습니다.
클래스 이름과 함께 도트(.) 연산자로 접근 합니다.

- 정적 필드와 정적 메소드는 객체 참조 변수로도 접근 가능합니다.
- == Calcul.grade3 = grade2
- 둘중 하나의 내용만 바꾸어도 둘다 바뀌게됩니다. 바로가기 폴더와 비슷한 성격이라고 생각합시다.
- (static으로 메모리에 로딩이 되어 주소값이 고정되기 때문입니다.)
정적 멤버를 사용한 클래스
public class Calcul {
static double pi = 3.141592;
static int plus(int x, int y) {
return x+y;
}
static int minus(int x, int y) {
return x-y;
}
}
실행 메소드
public class CarculExam {
public static void main(String[] args) {
// Calcul myCal = new Calcul(); == static 쓰지 않았을때.
double result1 = 10 * 10 * Calcul.pi;
int result2 = Calcul.plus(10,5);
int result3 = Calcul.minus(10,5);
System.out.println("result1 : " + result1);
System.out.println("result2 : " + result2);
System.out.println("result3 : " + result3);
}
}
결과 :
result1 : 314.1592
result2 : 15
result3 : 5
정적 블록
정적 필드를 선언할 때 복잡한 초기화 작업이 필요하다면 정적 블록을 이용합니다.
static {
...
}
정적 블록은 클래스가 메모리로 로딩될 때 자동으로 실행됩니다.
정적 블록이 클래스 내부에 여러개가 선언되어 있을 경우에는 선언된 순서대로 실행합니다.
정적 필드는 객체 생성 없이도 사용할수 있기 때문에 생성자에서 초기화 작업을 하지 않습니다.
정적 블록을 이용한 클래스
public class TeleVision {
//정적 멤버 선언
static String company = "MyCompany";
static String model = "LCD";
// static String info = company + model; // 실행불가. 너무 복잡합니다
static String info;
// 정적 블록 사용
static {
info = company + " - " + model;
}
}
메인메소드
public class TvExam {
public static void main(String[] args) {
System.out.println(TeleVision.info);
}
}
결과 :
MyCompany - LCD
인스턴스 멤버 사용 불가
정적 메소드와 정적 블록은 내부에 인스턴스 필드나 인스턴스 메소드를 사용할수 없으며, this도 사용이 불가능합니다.
정적 메소드와 정적 블록에서 인스턴스 멤버를 사용 하고 싶다면 객체를 먼저 생성하고 참조 변수로 접근해야 합니다.

public class Car {
// 인스턴스 필드
int speed;
// 인스턴스 메소드
void run() {
System.out.println(speed + "으로 달립니다.");
}
// 정적 메소드
static void simulate() {
Car myCar = new Car();
myCar.speed = 200;
myCar.run();
}
public static void main(String[] args) {
simulate(); //정적 메소드 호출
Car myCar = new Car();
myCar.speed = 60;
myCar.run();
}
}
public class test {
// 인스턴스 멤버와 메소드 선언 < -객체가 생성 되어야지만 메모리에 올라갑니다.
int field1;
void method1() {
}
//정적 멤버와 메소드 선언 <- 클래스 파일 생성만으로도 정적 멤버와 메소드가 메모리에 올라가 집니다.
static int field2;
static void method2() {
}
static {
// field1 = 10;
// method1();
field2 = 10;
method2();
}
static void method3() {
test obj = new test();
obj.field1 =10;
obj.method1();
field2 = 10;
method2();
}
}
final 필드 선언
- final 필드는초기값이 저장되면 최종적인 값이 되어서 프로그램 실행 도중 수정할수 없습니다.
- final 필드에 초기값을 주려면 필드 선언시에 초기값을 대입하거나 생성자에서 초기값을 대입해야 합니다.
final 타입 필드 [=초기값];
public class korean {
//인스턴스 final 필드 선언
final String nation = "대한민국";
final String ssn;
//인스턴스 필드 선언
String name;
//생성자 선언
public korean(String ssn,String name) {
this.name = name;
this.ssn = ssn;
}
}
public class KoreanExam {
public static void main(String[] args) {
korean k1 = new korean("123456-1234567", "감자바");
System.out.println(k1.nation);
System.out.println(k1.ssn);
System.out.println(k1.name);
// final 필드에는 값을 변경할수 없습니다.
// k1.nation = "USA";
// k1.ssn = "123-123-12134";
// 인스턴스 멤버의 값 변경은 가능합니다.
k1.name = "김자바";
}
}
상수 선언
- 상수 : 불변의 값을 저장하는 필드
- 상수는 객체마다 저장할 필요가 없고, 여러개의 값을 가져도 안 되기 때문에 static이면서 final
static final 타입 상수 [=초기값];
public class Earth {
//상수 선언 및 초기화
static final double EARTH_RADIUS = 6400;
// 상수 선언
static final double EARTH_SURFACE_AREA;
// 정적 블록에서 상수 초기화
static {
EARTH_SURFACE_AREA = 4 * Math.PI * EARTH_RADIUS * EARTH_RADIUS;
}
}
public class EarthExam {
public static void main(String[] args) {
System.out.println("지구의 반지름 : " + Earth.EARTH_RADIUS + "km");
System.out.println("지구의 표면적 : " + Earth.EARTH_SURFACE_AREA + "km^2");
}
}
'JAVA > Java 기초' 카테고리의 다른 글
| Getter & Setter .java (0) | 2023.01.11 |
|---|---|
| 패키지.java (0) | 2023.01.11 |
| 객체, 클래스 변수.java (0) | 2023.01.10 |
| 참조-배열 등등...java (0) | 2023.01.10 |
| 배열 응용문제 (0) | 2023.01.09 |