객체를 만들어내기 위한 설계 혹은 틀 또는 객체를 정의해 놓은 것, 코드로 구현한 것을 말한다.
문자열(String)도 클래스 형태로 클래스는 한 번 만든 문자열은 변하지 않는데(Immutable), 클래스는 변할 수 있다.(mutable)
클래스 이름은 PascalCase로 적는다.
변수(attribute, filed, 멤버변수) 와 메소드(method,함수)로 구성된다.
클래스의 로딩되는 시점
class Car{
int speed = 0; // 속성, 멤버 변수
void move(){ // 메소드 (method), 멤버 함수
speed = 10; //행위를 구현, 속성을 변경
}
}
독립적인
객체가 된다. Car carOne = new Car(); // new 키워드로 클래스에서 객체 생성
System.out.println(carOne.speed); // 객체명.으로 속성 접근 가능
carOne.move(); // 메소드 호출(method call) 이라고 부름.
System.out.println(carOne.speed);
Car carTwo = new Car();
System.out.println(carTwo.speed); // speed=0 독립적인 객체를 의미.
// STRING은 Immutable이기 때문에 값이 변하지 않지만,
// 클래스는 대부분 muttable이기 때문에 객체 참조에 대한 문제가 발생한다. 중요**
Car carThree = carOne;
// 참조형 객체이기 때문에 new일때만 새로운 객체를 생성하고,
// 이렇게하면 같은 객체를 가리킨다.
System.out.println(carThree.speed);
carThree.speed = 5;
System.out.println(carThree.speed);// 5
System.out.println(carOne.speed); // 5
애노테이션 | 설명 |
---|---|
@Override | 재정의된 메소드라는 정보 제공 |
@FuctionalInterface | 함수형 인터페이스라는 정보 제공 |
@Deprecated | 이후 버전에서 사용되지 않을 수 있는 변수, 메서드에 사용됨 |
@SupperessWarnings | 특정 경고가 나타나지 않도록 함 ex) @SupperessWarnings("deprecations")는 @Depreacted가 나타나지 않도록 함. |
클래스의 멤버 변수를 간접적으로 다룰 수 있게 하는 메소드
멤버 변수의 캡슐화를 구현하기 위해 사용. -> 정보은닉 / 보호
멤버 변수의 값을 제한해야 할 때 유용.
public class Main {
int x,y;
// 멤버변수를 만들어야 생성가능.
public int getX() {
// 경우에 따라 구현되지 않을 수 있다. 출력하지 않으면 사용 안하는 것.
return x;
}
// 들어오는 값에 대해 조건을 걸 수 있다.
public void setX(int x) {
if(x > 0 && x <= 1000){
this.x = x;
}else{
System.out.println("x should be 1 < x <= 1000!");
System.out.println("however, you put in x = "+x);
}
this.x = x;
}
public int getY() {
return y;
}
public void setY(int y) {
this.y = y;
}
}
class MainTest{
public static void main(String[] args) {
Main m = new Main();
m.x=10; // x에 private를 넣으면 직접 값을 변경할 수 없음.
System.out.println(m.x);
m.setX(20);
System.out.println(m.getX()); //권장된 처리 방식.
m.x = 20; // 권장하지 않는 멤버 변수 처리 방식
m.setX(11111);
System.out.println(m.getX());
}
}
클래스 또는 인스턴스를 생성할 때 단 한번 실행되는 코드 블록
public class Main {
static int classVar;
static int instanceCount;
int instanceVar;
// static initializer
static { // 객체가 생성되지 않은 상태 객체에서 접근 불가
System.out.println("static block1");
classVar = 20;
}
// object initialzer 객체를 만들어서 접근.
{
System.out.println("block1");
instanceVar = 30;
classVar = 50;
// 추천되지 않는다.
// 객체를 생성하는데 클래스에 대해 변하는것은 권장하지 않음.
instanceCount++; // 이러한 패턴은 사용된다.
}
// 여러개 사용 가능. 스태틱은 스태틱끼리 출력되고, 값은 나중에 선언된 값이 삽입됨.
static {
System.out.println("static block2");
classVar = 5;
}
{
System.out.println("block2");
instanceVar = 5;
}
}
class MainTest{
public static void main(String[] args) {
System.out.println(Main.classVar);
Main m = new Main();
System.out.println(Main.instanceCount
System.out.println(m.instanceVar);
System.out.println(Main.classVar);
Main m2 = new Main();
System.out.println(Main.instanceCount);
Main m3 = new Main();
System.out.println(Main.instanceCount
}
}