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 메서드를 이용해서 간접 접근으로 바꾼다. 이런 식으로 직접 접근을 막..
ch7-21 접근제어자 접근 제어자는 private, (default), protected, public 중 1개만 사용 가능하다. private는 같은 클래스, (default)는 같은 패키지 내에서만 접근 가능하다. protected는 같은 패키지 + 다른 패키지의 자손 클래스에서 접근 가능하고, public은 접근 제한이 없다. class에는 public, (default) 만 붙일 수 있다. 멤버에는 private, (default), protected, public 4가지 다 가능하다. 실습 package 이름은 pkg1, class 이름은 MyParentTest로 생성한다. MyParent 클래스를 만들어, 접근 범위를 Test 한다. p.prv는 오류난다. private는 같은 클래스만 접근..
ch7-17 제어자(modifier) modifer는 클래스, 클래스의 멤버 앞에 붙어서 부가적인 의미를 갖는다. modifier 종류는 접근 제어자 4개를 기본으로 그 외 제어자가 있다. 접근 제어자는 1개만 붙일 수 있다. (default)는 아무것도 붙이지 않는다. 여러 제어자(접근 제어자는 하나만)를 같이 쓸 수 있다. 순서는 상관 없지만 접근 제어자를 맨 왼쪽에 쓰는 것이 국룰이다. static은 멤버 변수, 메서드에 붙일 수 있다. iv 앞에 붙으면 cv가 된다. int width -> static int width 'static { }'는 괄호 안에 static 변수를 초기화한다. 대입 연산자(=)를 사용해서 변수의 값을 초기화하는 것을 간단(명시적) 초기화이다. 괄호({ })를 사용해서 초..
ch7-15 import문 import문을 사용하면 package 이름을 생략할 수 있다. Date는 첫 글자가 대문자이기 때문에 class 이름이다. 예제의 package는 java.util이고 Date는 class이다. 원래는 클래스 앞에 package까지 적어줘야 하지만 import문을 사용하면 컴파일러가 Date class를 만났을 때 이 클래스가 java.util 폴더에 있는 걸 알게 된다. 이클립스에 단축키 'Ctrl+shift+o'를 사용해서 import 자동 추가할 수 있다. 같은 class 이름이 있다면 선택지를 준다. 핵심 클래스는 java.lang에 넣어둬서 import 하지 않고 사용할 수 있다. '*'는 package 안에 있는 모든 클래스를 의미한다. 컴파일러가 클래스를 만났는데..
ch7-12 패키지(package) 패키지는 서로 관련된 클래스의 묶음으로 java8 기준으로 약 4천개의 class가 있고 이를 묶지 않고 관리하려면 쉽지 않다. 많은 클래스를 작은 단위로 나눠 관리하는 것이 package이다. java 파일을 컴파일하면 클래스 파일(*.class)이 된다. 패지키는 폴더가 된다. 폴더 안에 많은 클래스 파일을 넣어 관리한다. class는 package안에 있고 class 이름은 package를 포함해야한다. String을 그냥 썼지만 실제 이름은 "java.lang.String"이다. rt.jar 파일의 rt는 run time으로 "실행 중"을 의미한다. java 프로그램을 실행할 때 필요한 class 파일을 묶음이 rt.jar이다. *.jar는 클래스 파일을 묶어서..
ch7-10. 참조변수 super super는 객체 자신을 가리키는 참조변수이다. 인스턴스 메서드, 생성자에서만 사용가능하다. static 메서드에서는 사용 불가능하다. 이는 this와 비슷하다. this는 lv, iv를 구별할 때 사용했다. super는 조상 멤버와 자신 멤버를 구별할 때 사용한다. Child는 멤버가 Parent의 멤버 x 1개, 자신의 멤버 x, method 2개 해서 총 3개이다. 이를 객체로 그려보면 위와 같은데 같은 x이지만 하나는 조상의 것이어서 super.x이고 다른 하나는 this.x이다. 이름이 같더라도 객체는 따로 만들어진다. 이를 구분하기 위해서 super, this를 사용한다. c.method( )가 실행되면 첫 문장의 x는 가까운 20이 출력된다. this.x는 ..
ch7-7. 메서드 오버라이딩(Overriding) 상속받은 조상의 메서드를 자신에 맞게 변경하는 것 (정확히는 override는 '덮어쓰다'란 뜻으로, 메서드를 덮어쓰는 것이다. ) Point클래스는 2차원 좌표로 getLocation 메서드는 x, y좌표만 출력한다. Point를 상속받은 Point3D는 3차원 좌표로 그냥 쓰기에는 맞지 않다. 따라서 조상의 메서드를 override해서 String getLocation( )안을 z를 포함시켜 고친다. 선언부는 바꿀 수 없고 내용(구현부{ })만 변경 가능함. getLocation을 상속받기는 했지만 z출력이 되지 않는다. 따라서 override로 상속을 받아서 고쳐줘야 한다. 조상의 getLocation( )을 override해서 바꾼다. 출력 잘된..
ch7-5 단일 상속(Single Inheritance) 1. Java는 단일상속만을 허용한다.(C++은 다중상속 허용) Tv, DVD가 2개의 부모를 받는 것이 불가능하다. TvDVD가 Tv, DVD를 다중 상속받는다고 가정하면, Tv, DVD class에 이름이 같은 power 메서드가 있는데 내용이 다를 경우 충돌이 발생한다. Java가 나온 이후로 OOP언어는 단일 상속을 원칙으로 한다. 인터페이스를 사용하면 다중상속은 허용하면서 충돌이 일어나지 않게 Java가 해결책을 제시했다. 2. 비중이 높은 클래스 하나만 상속관계로 나머지는 포함관계를 한다. 인터페이스를 사용하지 않고 다중 상속처럼 사용하려면 하나만 상속관계로 하고 나머지는 포함관계로 만든다. Tv는 상속으로 처리하고 DVD는 포함으로 T..