14.1 멀티 스레드 개념하나의 스레드는 하나의 실행 흐름을 갖는다. 멀티 스레드는 동시에 여러 실행 흐름을 갖는다. 운영체제는 실행 중인 프로그램을 프로세스 process로 관리한다. 운영체제는 멀티 프로세스를 생성해서 처리 -> 멀티 태스킹멀티 프로세스 = 멀티 태스킹 이지만 멀티 스레드는 아니다. 멀티 스레드는 하나의 프로세스 즉 하나의 프로그램에서 여러 작업을 처리하는 것을 말한다. 하나의 프로세스 내에서 멀티 태스킹을 할 수 있도록 만들어진 프로그램들도 있다. 예를 들어 메신저는 채팅 작업을 하면서 동시에 파일 전송 작업을 수행하기도 한다. 멀티 프로세스가 프로그램 단위의 멀티 태스킹이라면 멀티 스레드는 프로그램 내부에서의 멀티 태스킹이라고 볼 수 있다. 다음 그림은 멀티 프로세스와 멀티 스레드..
ch7-38 인터페이스를 이용한 다형성 Fighter 클래스는 Unit을 상속받고 Fightable 인터페이스를 구현한다. Unit은 Fighter의 부모 이다. 따라서 다형성의 정의인 조상의 참조변수 Unit으로 자손 객체인 Fighter를 생성할 수 있다. Fightable도 다형성이 성립하니 부모가 될 수 있을까? Fightable은 엄밀히 따지면 부모는 아니지만 부모나 다름없다. 위 그림을 보면 다중 상속처럼 보인다. Unit과 Fightable에 같은 attack 메서드가 있으면 다중 상속의 문제인 충돌이 일어날까? Fightable은 구현부가 없이 선언부만 있기 때문에 충돌이 일어나도 상관 없다. 구현부는 Unit을 사용한다. 다중 상속은 Java에는 없는 개념이지만 인터페이스를 사용해서 다중..
ch7-35 인터페이스(interface) 프로그래밍 관점으로 보면 인터페이스는 추상 메서드의 집합이다. 외우자. static 메서드, 상수, default 메서드도 인터페이스에 포함되지만 부수적인 것이다. 추상 메서드이기 때문에 구현된 것이 전혀 없다. 상속받아 구현해야하므로 public이어야 한다. 한 객체에서 다른 객체의 변수에 접근할 때 메서드를 통해 접근하는 것을 캡슐화라 한다. iv 변수인 data를 메서드가 감싸고 있다. 따라서 메서드를 통해 접근해야한다. t.hour가 아니라 t.getHour()로 접근해야 한다. 인터페이스는 메서드의 껍데기라 할 수 있고, 제일 바깥에 노출되어 있으므로 제어자 public을 사용해야한다. 추상 클래스와 인터페이스의 차이가 무엇일까? 추상 클래스는 일반 클..
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..