ch7-34 추상 클래스의 작성 여러개의 클래스가 있다고 할 때 한 부분만 다르면 객체지향 개념에서는 공통된 부분만 뽑아 조상으로 만든다. 조상은 미완성 이므로 추상 클래스이고, 자손이 조상을 상속받아 다른 부분만 넣어 완성한다. 중복을 제거할 수 있다. 새로운 클래스가 만들어지면 조상 상속받아서 새로운 부분만 추가하면 된다. 객체 생성이 더 편해진다. 공통된 부분이 바뀌면 위는 3번 바꿔야 하지만, 아래는 공통 부분 1번만 바꾸면 되어 유지보수가 편하다. 코드의 관리, 변경이 용이하다. 추상 클래스를 한꺼번에 만들지 않고 위와 같이 단계적으로 만들면 장점이 있다. 공통된 부분을 바꾸고 싶을 때, 3번 째 자손에서 상속받아 구현하지 않고 2번 째 자손에서 상속받아 구현하면 변경에 훨씬 용이하다. 추상화는..
ch7-33 추상클래스의작성 왼쪽 각 클래스의 현재 위치 (x, y)와 move, stop 멤버가 중복되어 Unit 클래스로 중복을 제거한다. Marine, Tank는 지상이고 Dropship은 공중으로 움직이는 move 메서드가 달라 추상 메서드로 만든다. 기존 클래스의 공통 부분을 뽑아서 추상 클래스로 만든다. 공통부분이 꼭 추상 클래스가 되는 것은 아니지만, 공통이 되는 메서드는 구현부는 달라도 선언부는 일치하므로 부분만 추상 메서드로 만든다. 공통인 int x, y;와 void stop()이 제거되고 move 메서드만 구현하면 되므로 코드가 간결해진다. group의 타입이 Unit이므로 move 메서드를 사용할 수 있다. for문을 통해 실행되는 group[ i ].move(100, 200)은 U..
ch7-31 추상 클래스(abstract class) 미완성 메서드를 갖고 있으면 미완성 클래스이다. 이때, 미완성은 추상이라는 말과 같다. 추상 메서드를 갖고 있으면 추상 클래스이다. 추상 메서 드는 몸통{ } 즉 구현부가 없는 메서드로 미완성이기 때문에 구현부를 만들고 객체를 생성해야 한다. 구현부가 없는 대신에 추상 메서드 앞에는 abstract 제어자를 붙이고, 추상 메서드를 갖고 있는 클래스 또한 abstract 제어자를 붙인다. 추상 클래스의 인스턴스는 추상 메서드의 구현부가 완성되기 전에 객체 생성이 불가능하다. 추상 클래스를 상속 받아서 추상 메서드를 구현하면 더이상 추상 메서드가 아니기 때문에 abstract 제어자를 붙이지 않는다. Player는 추상 클래스이지만 상속받은 AudioPl..
ch7-29,30 여러 종류의 객체를 배열로 다루기 다형성의 장점은 1. 다형적 매개변수 2. 하나의 배열로 여러 종류 객체 다루기. 가 있는데, 이번에는 하나의 배열에 여러 종류 객체를 다루는 것을 배운다. 하나의 배열에는 같은 타입만 저장할 수 있다. 다형성을 이용하면 배열에 여러 종류의 객체를 저장할 수 있다. 그림을 보면 만들어진 객체의 그림은 다르지만, p1, p2, p3 참조 변수를 배열에 담은 것 외에는 차이가 없다. 조상타입의 배열을 만들면 다형성으로 Product 객체 말고도 자손 객체인 Tv, Computer, Audio를 배열에 담을 수 있다. 같은 것도 올 수 있지만 다른 자손 객체가 들어올 수 있어 여러 종류 객체를 담을 수 있다. Product 타입의 cart 배열을 만들어서 여..
ch7-27 매개변수다형성 다형성의 장점은 1. 다형적 매개변수 2. 하나의 배열로 여러종류 객체 다루기. 가 있다. ⭐ 다형성 정리 1. 조상 타입의 참조 변수로 자손 객체 다루기. ex) Tv t = new SmartTv(); 2. 참조 변수의 형변환 → 멤버 갯수 조절 3. instanceof 연산자 → 형변환 가능 여부 확인 Product라는 부모 클래스, Product를 상속받은 Tv, Computer, Audio 자손 클래스가 있다. 이를 사는 Buyer 클래스가 있다. Buyer 클래스에 buy 메서드를 추가할 때, 매개변수로 new Tv( ); 만 들어올 수 있다. 하지만 다른 물건을 산다 할 때, 매개변수를 바꿔서 메서드를 다시 만들어줘야 한다. 메서드 이름은 같고 매개변수를 바꾼 것을 ..
ch7-26 instanceof 연산자 instanceof 연산자는 참조변수의 형변환 가능여부 확인에 사용한다. 참조변수의 형변환은 조상, 자손 사이에서만 가능하다. 형변환을 할 때는 1. instatnceof 연산자를 사용해서 형변환 가능여부 확인 후 그다음 2. 형변환 해야 한다. new Car(), new FireEngine(), new Ambulance() 3문장 모두 매개변수로 들어갈 수 있다. 다형성으로 Car또는 Car의 모든 자손이 들어갈 수 있다. Ambulance는 FireEngine과 형제관계이기 때문에 형변환이 불가능하다. 이를 판별하는 연산자가 instanceof이다. 만약 Ambulance를 형변환 하고 싶으면 else if문을 추가할 수 있다. instanceof 연산자는 조상..
ch7-24,25 참조변수의형변환(2) "car."을 입력했을 때 사용할 수 있는 메서드가 나온다. 이 때 water는 존재하지 않는다. 최고 조상인 Obejct의 자손들도 나온다. 매개변수 car를 FireEngine 타입으로 형변환 하고나서, "fe."을 입력하면 사용할 수 있는 멤버가 늘어나 water()를 사용할 수 있다. 참조변수 car의 값이 null이어도 형변환은 가능하다. 하지만 car2.drive()를 호출했을 때 오류가 발생한다. NullPointerException은 아무 객체가 없는데 호출할 경우 발생하는 오류이다. java.lang.ClassCastException은 컴파일 에러가 아니라 실행 에러이다. (FireEngine)으로 형변환 하면 컴파일러는 참조변수 c가 실제로 Car..
ch7-24 참조변수의 형변환 ⭐ 참조변수의 형변환의 결과는 사용할 수 있는 멤버의 갯수를 조절하는 것이다. 멤버의 갯수 말고는 달라지는 점이 없다. 3.6 실수형을 정수형으로 형변환 하면 3으로 값이 바뀐다. 기본형의 형변환은 값이 바뀐다. 하지만 참조변수의 형변환은 사용할 수 있는 멤버 갯수만 변하고 주소값, 객체 등 전혀 바뀌는 것이 없다. FireEngine 인스턴스의 멤버는 상속받은 4개, 자신의 것 1개 총 5개가 있다. Car c = (Car)f;는 Car 타입의 참조변수 c에 참조변수 f를 대입한다. f는 FireEngine 타입으로 대입 연산자에서 양변의 타입이 일치하지 않기 때문에 형변환을 해줘야 한다. 참조변수 f와 FireEngine 인스턴스는 일치하지만, 참조변수 c는 Car 타입..
ch7-23 다형성 ⭐ 조상 타입 참조 변수로 자손 객체 타입 객체를 다루는 것 -> 외우기 Tv클래스를 상속받는 자식 SmartTv를 만든다. SmartTv의 멤버는 상속 받은 5개 + 자신의 것 2개 해서 총 7개의 멤버를 갖고 있다. 객체를 생성할 때 지금까지는 타입을 일치시켜 객체를 생성했다. 하지만 다형성에서는 타입이 불일치할 수 있다. 즉 조상 타입 참조 변수로 자손 객체를 생성할 수 있다. 참조변수와 객체의 타입이 일치할 때와 일치하지 않을 때의 차이는 뭘까? 왼쪽 그림은 참조변수의 멤버가 7개이고, SmartTv 멤버도 7개이므로 모든 객체를 사용할 수 있다. 오른쪽 그림은 참조변수가 Tv로 멤버가 5개이고, SmartTv 멤버가 7개 이어도 쓸 수 있는 건 5개이다. 조상 타입 참조 변수..
ch7-22 캡슐화와 접근 제어자 접근 제어자는 외부로부터 데이터를 보호하기 위해서 사용한다. 이를 캡슐화라 한다. Time 클래스를 만들었을 때 멤버를 public 제어자로 썼을 때 접근 제한이 없기 때문에 객체를 생성하고, t.hour = 25;로 직접 접근해서 값을 변경할 수 있다. int의 범위는 ±20억으로 사용은 할 수 있지만, hour는 시간으로 범위가 0~23로 제한되야 한다. 따라서 iv를 보호하기 위해서는 제어자를 public이 아니라 private를 사용해서 외부의 접근을 막는다. 메서드는 public으로 만들어 iv에 간접적으로 접근한다. t.hour에 대입 연산자를 사용해서 직접 접근하지 않고, t.setHour 메서드를 이용해서 간접 접근으로 바꾼다. 이런 식으로 직접 접근을 막..