Class(클래스)
자바에서 생성되는 최소 단위로 객체를 사용하기 전 설계해 놓은 것이다.
객체의 특성 - 변수
객체의 기능 - 메소드
package AirCon;
public class AirCon {
//(멤버)변수 정의(변수는 모두 소문자)
String company;
String color;
int price;
int size;
int temp;
//메소드 정의(하나의 행위. 메소드의 첫글자는 소문자로 쓰는 것이 관습이다.)
void onPower() {
System.out.println("power on");
}
void offPower() {
System.out.println("power off");
}
void upTemp() {
temp++;
}
void downTemp() {
temp--;
}
}
클래스 내부에 변수를 정의 하면 멤버 변수이다. 변수는 모두 소문자로 작성하고 알아서 초기화를 해주지 않아도 기본값으로 초기화가 된다.
메소드는 클래스의 내부 함수 라고 불린다. 메소드의 첫글자는 소문자로 쓰고 두번째 단어의 첫글자만 대문자로 쓰는 게 관습이다. 형태는 "리턴타입 메소드명(){ }" 이렇게 작성하는데 반환값은 각 데이터 타입을 써주면 된다. 반환 값이 없는 위 같은 상황에서는 void로 작성한다. 메소드 이름 뒤 () 중괄호 안에는 소스를 실행하기 위한 값을 받는데 이것을 매개 변수 라고 한다. 메소드 안에서 변수 선언을 하게 되면 Local(지역)변수 라고 한다. 꼭 초기화를 시켜줘야 활용할 수 있다.
이 자체로는 설계만 해뒀기 때문에 효력이 없고, Main에서 불러서 사용해야 의미가 있다.
객체 생성
객체는 레퍼런스값(주소값)으로 저장되어 변수를 가리키고 있는데 이것을 참조형 변수 라고 한다. 객체를 생성할 때는 Scanner 메소드를 사용할 때처럼 사용하면 된다. "AirCon airCon = new AirCon();" 형태는 이렇다. AirCon(클래스명) airCon(변수명) = new(연산자) AirCon(); (클래스명)
package AirCon;
public class AirConUser1 {
public static void main(String[] args) {
AirCon airCon = new AirCon();
//변수사용
airCon.color = "White";
airCon.temp = 10;
airCon.price = 10000;
//메소드
airCon.upTemp();
System.out.println("airCon.temp = " + airCon.temp +
", airCon.color = " + airCon.color +
", airCon.price = " + airCon.price +"원 ");
airCon.onPower();
airCon.offPower();
airCon.downTemp();
System.out.println("airCon.temp = " + airCon.temp + ", airCon.color = " +
airCon.color + ", airCon.price = " + airCon.price + "원 ");
}
}
AirCon airCon = new AirCon();
객체 생성을 해주지 않으면 사용할 수 없다.
airCon.color = "White";
airCon.temp = 10;
airCon.price = 10000;
변수 사용을 하면 각 값이 할당된다.
airCon.temp = 11, airCon.color = White, airCon.price = 10000원 power on power off airCon.temp = 10, airCon.color = White, airCon.price = 10000원 |
같은 클래스를 이용해서 객체를 여러개 생성할 수 있다.
여러 번 생성해도 모두 독립적이라 할당 값을 주어도 모두 다르게 줄 수 있다. 객체에 저장되는 변수 값은 다른 변수 값에 영향을 주지 않는다. 다만, "airCon2 = airCon1" 이런식으로 대입을 하면 레퍼런스값(주소값)이 같아지기 때문에 같은 객체를 가리키게 되고 하나만 바꿔도 둘 다 바뀌게 된다!!
package AirCon;
public class AirConUser2 {
public static void main(String[] args) {
AirCon airCon1 = new AirCon();
//변수사용
airCon1.color = "White";
airCon1.temp = 10;
airCon1.price = 10000;
//메소드 사용
airCon1.upTemp();
System.out.println("aircon1.temp = " + airCon1.temp + ", airCon1.color = " + airCon1.color +
", airCon1.price = " + airCon1.price + "원");
airCon1.onPower();
airCon1.offPower();
airCon1.downTemp();
System.out.println("aircon1.temp = " + airCon1.temp + ", airCon1.color = " + airCon1.color +
", airCon1.price = " + airCon1.price + "원");
//두번째 객체 생성
AirCon airCon2 = new AirCon();
System.out.println("aircon2.temp = " + airCon2.temp + ", airCon2.color = " + airCon2.color +
", airCon2.price = " + airCon2.price + "원");
//airCon2 변수에 airCon1 변수 참조값 할당
airCon2 = airCon1;
System.out.println("aircon2.temp = " + airCon2.temp + ", airCon2.color = " + airCon2.color +
", airCon2.price = " + airCon2.price + "원");
}
}
aircon1.temp = 11, airCon1.color = White, airCon1.price = 10000원 power on power off aircon1.temp = 10, airCon1.color = White, airCon1.price = 10000원 aircon2.temp = 0, airCon2.color = null, airCon2.price = 0원 aircon2.temp = 10, airCon2.color = White, airCon2.price = 10000원 |
두번째 객체를 생성 했을 때 아무것도 할당을 하지 않고 바로 출력을 해서 출력값도 초기화 값 그대로이다.
airCon2 = airCon1;
그 뒤에 2에 1을 대입했기 때문에 위에서 출력한 값이 그대로 출력된다. 만들어진 객체에 이렇게 대입 할 수 있다는 것만 알아두면 되는데 실제로는 많이 사용하지 않음
변수 종류
자바에서 변수는 중괄호{} 안에만 있다면 어디서든 선언 가능하지만 위치에 따라서 종류가 다르다. 기준은 클래스가 결정하는데 클래서 내부에 위치하면 MemberVar(멤버변수), 메소드 내부에 선언되면 LocalVar(로컬/지역 변수)이다. 멤버 변수는 다시 두 개로 나눌 수 있다. InstanceVar(인스턴스 변수)와 Static변수인데 구분하기 쉽다. Static이라는 글씨가 있으면 Static변수 없으면 인스턴스 변수이다.
인스턴스(Instance) 멤버 변수
클래스 영역에 정의되고 static이 없으면 끝! 초기화 하지 않아도 컴파일러가 알아서 데이터 타입의 기본 값으로 초기화 한다. 독립적인 객체이기 때문에 동일한 클래스에 생성이 되어도 서로 연관이 없다. heap 영역에 저장이 된다.
static 멤버 변수
클래스 영역에 정의 되고 static이 있다면! 마찬가지로 자동 초기화 한다. static 변수는 다른 클래스에서 객체 생성을 하지 않고도 사용 가능하고, 해당 클래스 타입으로 생성된 모든 객체에서 공유가 된다. heap 영역에 저장이 된다.
로컬(Local) 변수
메소드에 선언 되는 변수로 초기화 하지 않으면 컴파일 오류가 생긴다. 로컬 변수는 stack 영역에 초기화 되었다가 메소드 실행이 종료되면 자동으로 메모리에서 소멸한다.
package AirCon;
public class VariableKind {
//인스턴스 멤버 변수
int memVar;
//static 멤버 변수
static int staticVar;
public static void main(String[] args) {
//로컬변수
int localVar = 0; //초기화를 안 하면 오류가 남
VariableKind vk1 = new VariableKind();
System.out.println("vk1.memVar = " + vk1.memVar);
System.out.println("vk1.staticVar = " + vk1.staticVar);
System.out.println("VariableKind.staticVar = " + VariableKind.staticVar);
System.out.println("sraticVar = " + staticVar);
VariableKind vk2 = new VariableKind();
vk2.memVar = 100;
vk1.staticVar = 20;
System.out.println("vk1.memVar = " + vk1.memVar);
System.out.println("vk2.memVar = " + vk2.memVar);
System.out.println("vk1.staticVar = " + vk1.staticVar);
System.out.println("vk2.staticVar = " + vk2.staticVar);
System.out.println("localVar = " + localVar);
}
}
vk1.memVar = 0 vk1.staticVar = 0 VariableKind.staticVar = 0 sraticVar = 0 vk1.memVar = 0 vk2.memVar = 100 vk1.staticVar = 20 vk2.staticVar = 20 localVar = 0 |
int memVar;
인스턴스 멤버 변수는 객체 생성 없이 바로 사용하면 안 된다. 객체 생성 후에 vk1.memVar 형식으로는 사용 가능하지만, VariableKind.memVar 이렇게 클래스명을 붙여서 바로 사용하는 것은 불가능하다. 매 변수가 레퍼런스 값이 다르기 때문이다. Static 변수의 경우 모든 게 반대다. 같은 클래스 내에서는 레퍼런스 값이 같고 가르키는 값이 같기 때문에 객체 생성 없이 사용 가능하고, 클래스명으로 바로 부를 수 있다.
int localVar = 0;
로컬 변수는 초기화를 안 하면 오류가 난다.
VariableKind vk1 = new VariableKind();
System.out.println("vk1.memVar = " + vk1.memVar);
System.out.println("vk1.staticVar = " + vk1.staticVar);
System.out.println("VariableKind.staticVar = " + VariableKind.staticVar);
System.out.println("sraticVar = " + staticVar);
첫번째 객체 생성
클래스의 변수를 사용하려면 객체명.변수명이 기본이다. 하지만 static변수는 기본 외에도 클래스명.변수명을 바로 사용할 수 있고, 변수명만으로도 바로 접근이 가능하다.
VariableKind vk2 = new VariableKind();
vk2.memVar = 100;
vk1.staticVar = 20;
System.out.println("vk1.memVar = " + vk1.memVar);
System.out.println("vk2.memVar = " + vk2.memVar);
System.out.println("vk1.staticVar = " + vk1.staticVar);
System.out.println("vk2.staticVar = " + vk2.staticVar);
두번째 객체 생성
두번째 객체의 인스턴스 멤버 변수에 100을 할당했다. static 변수에는 20을 할당했다. 각 1-2객체를 출력하면 인스턴스 변수는 독립적인 객체이기 때문에 서로 다른 값이 출력된다. 그에 반해 static 변수는 모든 객체에서 값을 공유하기 때문에 같은 값이 출력된다.
'개발일지 > Java + Spring' 카테고리의 다른 글
[Java] 성적 입출력 - 클래스로 나누기, 소수점 n번째 자리 (0) | 2021.09.28 |
---|---|
[Java] 메소드 정의와 다양한 종류 - 매개변수(parameter), 인자(Argument) (0) | 2021.09.27 |
[Java] 0924 클래스의 구조 / 상위 클래스를 상속 받은 클래스 (0) | 2021.09.24 |
[Java] 팩토리얼 + 피보나치 수열로 재귀함수 배우기 (0) | 2021.09.22 |
JVM이란? JVM의 구성요소 (0) | 2021.09.20 |