2/26 TIL

큰모래·2023년 2월 26일
0

Static

class Car {
	static int maxSpeed;
}

Car c1 = new Car();
c1.maxSpeed = 100;  // 사실상 c1.maxSpeed가 아닌 Car.maxSpeed 로 처리된다.

Car c2 = new Car();
c2.maxSpeed = 200;

Car c3 = new Car();
c3.maxSpeed = 300;

System.out.println(c1.maxSpeed);  // 300
System.out.println(c2.maxSpeed);  // 300
System.out.println(c3.maxSpeed);  // 300
  • maxSpeed 메서드를 static으로 생성
  • Car 객체를 3개 생성하고 각 객체마다 maxSpeed 메서드를 실행시켰지만 결국 maxSpeed 메서드는 Car 클래스에서 선언한 메서드 하나만 사용한 것이다.
  • 각 객체가 고유한 특성을 가진 것이 아닌 모두 공통된 값을 가지는 것은 static을 붙여도 된다.

객체 생성 및 인스턴스 메서드 실행

class Main {

		public static void main(String[] args) {
				자동차 a자동차;

				a자동차 =  new 자동차();

				a자동차.달리다();
		}

}

class 자동차 {
		void 달리다() {
				System.out.println("자동차가 달립니다!");
		}
}
  • 자동차 a자동차;
    • a자동차 에는 자동차 클래스로 만든 쓰레기 리모콘이 들어가게 된다.
  • a자동차 = new 자동차();
    • 자동차 설계도(클래스)로 자동차 객체를 만든다.
    • 자동차 객체는 자신을 조종할 수 있는 리모콘(this)를 가지고 태어난다.
    • a자동차 안에 들어있던 쓰레기 리모콘이 진짜 리모콘으로 대체된다.
  • class 자동차 ~
    • 자동차 설계도 (자동차가 아니다)

상속

  • 객체지향은 중복코드를 없애기 위해 존재한다.
  • 객체지향적인 구조를 위해서 일부로 중복코드를 허용하는 경우도 있다.
  • 코드의 재사용성과 유지보수성을 높이는 데 큰 도움이 된다.
  • 상속은 상황이 복잡해지면 중복을 못 없애는 경우가 발생한다.
class 무기 {}

classextends 무기 {
		void 공격() {
				System.out.println("칼로 공격");
		}
}

class Main {
		public static void main(String[] args) {
				무기 a무기 = new();

				a무기.공격();
		}

}
  • 상속은 자바에서 A is B 임을 알려주는 행위이다.
    • 칼 extends 무기 → 칼은 무기이다.
  • 무기 a무기 = new 칼();
    • a무기는 무기를 조종하는 리모콘이기만 하면됨.
    • 칼은 무기이므로 해당 문장은 에러가 나지 않는다.
  • a무기.공격();
    • a무기는 공격 메서드를 가질 수 없으므로 에러가 난다.

형변환

  • 자바는 안전하다고 생각하면 자동으로 형변환하여 컴파일해준다.
  • 자바는 버튼을 제거하는 것은 안전하다고 판단한다.
  • 자바는 버튼이 추가되는 것은 위험하다고 판단한다.
  • 리모콘이 상위(추상)타입으로 변하는 경우는 버튼이 줄어들 가능성만 존재
  • 리모콘이 하위(구체)타입으로 변하는 경우는 버튼이 추가될 가능성만 존재
  • 강제형변환을 해도 컴파일 단계까지는 무조건 성공함, 하지만 실행 단계에서 오류(예외)가 발생함\
//int형 변수 i에 double형 변수 d값을 넣는 것은 안전하지 않다.
//이때 자바 컴파일러는 안전하지 않다고 판단하여 예외를 발생시킨다.
//따라서 우리는 이와 같은 경우 수동형변환을 해주어야 한다.
//단, 개발자가 안전하다고 판단한 경우에만 수동형변환을 해야만 한다.
double d = 5.0;
int i = d;      // X
int i = (int)d; // O  

//double형 변수 d에 int형 변수 k를 넣는 것은 안전하다.
//이때, 자바 컴파일러는 자동형변환을 해준다.
int k = 5;
double d = k;

생성자

class Main {
    public static void main(String[] args) {
        전사 a전사 = new 전사("하하");
        // a전사.이름 = "카니"; // 자동으로 NoName
        // a전사.나이 = 22; // 자동으로 20살
        System.out.println(a전사.이름); // 출력 : 카니
        System.out.println(a전사.나이); // 출력 : 22
    }
}

class 전사 {
    String 이름;
    int 나이;

	// 생성자 메서드는 특수한 메서드 이다.
    // 명시적으로 개발자가 호출 할 수 없고, 객체가 생성될 때 자동으로 호출된다.
    // 생성자 메서드는 리턴타입이 없다.
    전사() {
    	// this(); 와 같은 형태의 호출은 생성자에서만 가능하다.
        this("NoName"); // 아래 있는 생성자를 호출
    }

    전사(String 이름) {
        this.이름 = 이름;
        나이 = 20;
    }
}
profile
큰모래

0개의 댓글