[java] 기초(2)

세상을 바꾸는 개발자·2023년 2월 23일
0

LikeLion

목록 보기
2/5

직접 만든 클래스로 객체 생성

번호, 이름, 나이, 키, 기혼여부에 대한 객체를 생성할 시,
자료형이 다양해서 자바에서 기본으로 제공해주는 클래스로 사용할 수없음 -> 클래스 직접 만듦

  • 클래스로 할 수 있는 것 3가지
    1. 객체를 만들 수 있음
    2. 객체를 조종할 수 있는 리모콘을 만들 수 있음
    3. 객체 리모콘을 담을 변수도 만들 수 있음
class GameCharacter {
	int no;
	int age;
   	int height;
}

GameCharacter person1 = new GameCharacter(); // 객체, 인스턴스가 생긴다.
person1.no = 1; // 사람 1의 번호, 인스턴스 변수
person1.age = 20; // 사람 1의 나이, 인스턴스 변수
person1.height = 170; // 사람 1의 키, 인스턴스 변수

GameCharacter person2 = new GameCharacter();
person2.no = 2; // 사람 2의 번호, 인스턴스 변수
person2.age = 30; // 사람 2의 나이, 인스턴스 변수
person2.height = 180; // 사람 2의 키, 인스턴스 변수



객체가 필요한 이유

변수에는 오직 값 1개만 넣을 수 있다.
프로그래밍을 하다보면 변수에 값을 여러 개 넣을 필요가 있을 때가 있다.
그래서 고안된 것이 객체이다.


static

각 인스턴스들이 공통적으로 같은 값이 유지되어야하는 경우 사용

class Main {
    public static void main(String[] args) {
        자동차 a자동차 = new 자동차();
        a자동차.달리다();
    }
}

class 자동차{
    void 달리다(){}
}

=> static이 없을 경우 객체를 생성하여 사용


class Main {
    public static void main(String[] args) {
        자동차.달리다();
    }
}

class 자동차{
    static void 달리다(){}
}

=> static이 있을 경우 객체 생성없이 바로 사용


class Person {
  static int maxSpeed;
}

Person p1 = new Person();
p1.maxSpeed = 100; // 이 코드는 실질적으로 `Person.maxSpeed = 100;` 으로 처리된다. 왜냐하면 p1 객체에는 maxSpeed 변수가 없고, maxSpeed 변수는 클래스에 1개만 존재하기 때문이다.
Person p2 = new Person();
p2.maxSpeed = 200;
Person p3 = new Person();
p3.maxSpeed = 300;

System.out.println(p1.maxSpeed); // 300 // 이 코드는 실질적으로 System.out.println(Person.maxSpeed); 와 같다.
System.out.println(p2.maxSpeed); // 300
System.out.println(p3.maxSpeed); // 300

=> static이 있는데도 객체를 생성했을 경우, 객체가 여러개 생성되도 static 변수는 딱 하나만 있음. static 변수에 대해 값이 통일 되어 출력됨


레퍼런스변수에 값 할당 과정

class Main {
    public static void main(String[] args) {
        // 오직 자동차 리모콘만 저장 할 수 있는 변수 `a자동차`를 만든다.
        // `a자동차` 에는 자동차 클래스로 만든 리모콘(쓰레기 리모콘)이 들어가게 된다.
        자동차 a자동차;

        // 자동차 설계도(클래스)로 자동차 객체를 변수 외!부!에 만든다.
        // 자동차 객체는 자신을 조종할 수 있는 리모콘(this)를 가지고 태어난다. 즉 자동차 객체 만들 때 자동차 리모콘도 같이 만들어진다.
        // 자동차 객체는 자신이 들고 있는 리모콘(this)를 복사해서 반환한다.
        // a자동차 안에 들어있던 쓰레기 리모콘이 진짜 리모콘으로 대체된다.
        a자동차 = new 자동차();

        // `a자동차` 변수에 안에 있는 리모콘의 `달리다` 버튼을 누른다.
        // 해당 신호가 리모콘과 연결되어 있는 자동차 객체에 전달되어 `달리다` 기능이 실행된다.
        a자동차.달리다();

        // 모든 객체들은 서로를 평생 볼 수 없다.
        // 모든 객체들은 서로를 원격조종한다.
    }
}

// 자동차 설계도
class 자동차 {
    // 이 메서드(함수)의 2가지 용도
    // - 객체 만들때 : 실제 기능
    // - 리모콘 만들때 : 리모콘 버튼
    void 달리다() {
      	System.out.println("자동차가 달립니다.");
    }
}



상속

A is B임을 알려주는 행위
장점 - 중복된 코드가 사라짐
단점 - 자바에서 다중 상속 불가. (메소드가 겹칠 수 있기 때문에)
->복잡한 구조일 때는 중복 코드를 완전히 해결 못함 -> '구성' 사용

class 고양이 {
    void 숨쉬다() { }
    void 야옹() { }
    void 뛰어넘다() { }
}

class 검은고양이 extends 고양이 { //검은 고양이 is 고양이
    void 미래를_예지하다() { }
}

class 흰고양이 extends 고양이 { //흰고양이 is 고양이
    void 목숨을_늘린다() { }
}

class 점박이고양이 extends 고양이 { //점박이고양이 is 고양이
    void 춤춘다() { }
}

흰고양이 a = new 흰고양이();
a.숨쉬다();
a.야옹();
a.미래를_예지하다();

검은고양이 b = new 검은고양이();
b.숨쉬다();
b.야옹();
b.목숨을_늘린다();

점박이고양이 c = new 점박이고양이();
c.숨쉬다();
c.야옹();

=> 검은, 흰, 점박이 클래스에 void 숨쉬다(){} void 야옹(){}을 각각 안넣고, 고양이라는 부모 클래스에 한 번만 넣어 중복 코드를 최소화


형변환

자바는 안전하지 않으면 자동형변환을 해주지 않음

자동형변환

int a = 1;
double b = a; //b=1.0

=> 아무리 a의 값이 커도 int의 범위가 double의 범위보다 작기 때문에 컴파일러가 안전하다고 생각해서 자동형변환시킴


무기 a무기 = new 칼();

class 무기{}
class 칼 extends 무기{}

=> 칼리모콘이 무기리모콘으로 변환하는 것은 안전하다고 생각하여 자동형변환시킴


수동형변환

double a = 1.0;
int b = (int)a;

=> 컴파일러는 1.0이 1과 같다고 인식을 못하기 때문에 정수로 바꿀 수 있다는 생각을 못해서 수동으로 형변환시켜야함


자동차 a자동차 = new 페라리();
페라리 a페라리 = (페라리)a자동차;

class 자동차 {}
class 페라리 extends 자동차{}
class 스파크 extends 자동차{}

=> 자동차리모콘이 페라리리모콘으로 자동변환하는 것은 안전하지 않음. 스파크로도 변환될 수 있기 때문에


상위타입을 사용해야하는 이유


DVD방에 각각의 다른 TV가 있을 경우
각각의 TV에 대한 리모콘들을 모두 가져야하지만, 상위타입을 사용하면 통합리모콘에 기능을 다 담을 수 있어서 편리함 (단, 통합리모콘에 모든 기능이 들어있지는 않음. 자주 쓰는 특정 기능만 모아서 사용)

TV aTv1 = new LGTv();
TV aTv2 = new 샤오미Tv();
TV aTv3 = new 삼성Tv();
TV aTv4 = new 독일Tv();

TV[] tvs = new TV[4];
tvs[0] = aTv1;
tvs[1] = aTv2;
tvs[2] = aTv3;
tvs[3] = aTv4;

for(TV tv : tvs){
	tv.끄기();
}```



컴파일타임과 런타임

컴파일 - 실행을 위한 중간 과정(소스코드를 실행파일로 만드는 과정 : 1초~10시간). 컴파일러는 예측할 수 있는 기능이 없음
런타임 - 실행했을 때 나오는 시간

  • 런타임 오류시, Exception~~ 으로 시작함
profile
초심 잃지 않기

0개의 댓글