Difference between r1.94 and the current
@@ -14,24 +14,25 @@
=== 발표 내용 ===
* '''상속(Inheritance)''' : 상속을 받은 자손 클래스는 상속을 해준 조상 클래스의 메서드나 변수를 쓸 수 있다.
* 재사용(재활용)을 통해서 코드가 간결해지는 장점이 있다.
* 인터페이스를 통해 단일 상속을 보완할 수 있다.
* 다중 상속의 문제점은 자손 클래스에서 어느 한 메서드나 변수를 가져 올 때 서로 다른 조상 클래스에서 같은 이름을 가진 메서드나 변수가 있다면 이것들이 어디서 오는건지 몰라서 문제가 생기기 때문이다.
{{{class 상속받는 클래스 extends 상속하는 클래스
Ex)
* '''Object class''' : '''최상위 클래스'''이다. 상속 받는 클래스가 없다면 그 클래스는 Object class에게 상속을 받는다.
* 위의 예시의 Car 클래스도 이미 Object class에게 상속받고 있다. 따로 입력을 해주지 않아도 컴파일러 단계에서 붙여준다.
* toString() : 아무 숫자를 문자열로 바꾸어 주는 메서드
* equals() : 문자열이 같은지 판단하는 메서드(대소문자 구별, boolean 값 리턴)
* '''오버 라이딩'''
* 조상 클래스에서 정의된 메서드를 자손 클래스에 '''재정의'''하는 것을 말한다.
* 오버로딩과 비교하자면 오버로딩은 기능을 추가하는 것이라면 오버 라이딩은 내용을 수정하는 것이다.
* 자손 클래스에서 오버 라이딩을 하면 조상 클래스의 메서드를 '''은닉'''을 할 수 있다.('''은닉화''')
* '''상속(Inheritance)''' : 상속을 받은 자손 클래스는 상속을 해준 조상 클래스의 메서드나 변수를 쓸 수 있다.
* 재사용(재활용)을 통해서 코드가 간결해지는 장점이 있다.
* 상속 시 생성자의 순서는 부모 클래스 -> 자손 클래스이다.(super()에서 자세한 설명)
* '''JAVA'''는 '''단일 상속'''만 지원한다.(C++는 다중 상속을 지원한다.)* 인터페이스를 통해 단일 상속을 보완할 수 있다.
* 다중 상속의 문제점은 자손 클래스에서 어느 한 메서드나 변수를 가져 올 때 서로 다른 조상 클래스에서 같은 이름을 가진 메서드나 변수가 있다면 이것들이 어디서 오는건지 몰라서 문제가 생기기 때문이다.
{{{class 상속받는 클래스 extends 상속하는 클래스
Ex)
class Car{ 생 략... }
class Taxi extends Car{ 생 략... } }}}
class Car{ }
class Taxi extends Car{ } }}}
* '''Object class''' : '''최상위 클래스'''이다. 상속 받는 클래스가 없다면 그 클래스는 Object class에게 상속을 받는다.
* 위의 예시의 Car 클래스도 이미 Object class에게 상속받고 있다. 따로 입력을 해주지 않아도 컴파일러 단계에서 붙여준다.
class Car extends Object{ }
* 11가지의 메서드를 기본적으로 가지고 있다. (toString(),equals() 등등)* '''오버 라이딩'''
* 조상 클래스에서 정의된 메서드를 자손 클래스에 '''재정의'''하는 것을 말한다.
* 쓰는 이유 : mp3라는 클래스에 재생 메서드가 있다면 아이팟, 갤럭시플레이어 등 다양한 플레이어에서 각각의 다른 재생 메서드가 필요하므로 각 자손 클래스에서 재생 메서드를 오버 라이딩해서 사용한다.
* 오버 라이딩은 이름, 매개변수, return 타입이 같아야한다.* 오버로딩과 비교하자면 오버로딩은 기능을 추가하는 것이라면 오버 라이딩은 내용을 수정하는 것이다.
* 자손 클래스에서 오버 라이딩을 하면 조상 클래스의 메서드를 '''은닉'''을 할 수 있다.('''은닉화''')
@@ -52,19 +53,19 @@
* super()는 상위 클래스의 생성자를 가리 킬때도 쓰인다.
{{{
class Car{
class Taxi extends Car{
Taxi(){
super();
생 략... }
super() = Car()
쉽게 super()를 Car 생성자 메서드라고 생각하면 된다.
주의! : 자손 클래스의 생성자안에서 맨 앞에 super();가 있어야한다.
{{{
class Car{
Car(){ 생 략...}
Car(){ }
}class Taxi extends Car{
Taxi(){
super();
}
}super() = Car()
쉽게 super()를 Car 생성자 메서드라고 생각하면 된다.
주의! : 자손 클래스의 생성자안에서 맨 앞에 super();가 있어야한다.
왜냐하면 부모 클래스가 미리 메모리에 적재되어야 하기 때문이다.
왜냐하면 부모 클래스가 미리 메모리에 적재되어야 자손클래스가 적재할수 있기 때문이다.
}}}@@ -80,28 +81,38 @@
}}}
* 제어자는 접근 권한을 제한하는 것.
* 그래서 abstract는 private로 설정 할 수 없다.
{{{
private static Car A = new Car();
private car(){}
* 제어자 - static, final, static final, abstract
* '''제어자''' : 접근 권한을 제어하는 것.
||접근 제어자|| public, protected, default, private ||
|| 그 외 || static, final, abstract, native, transient, synchronized, volatile, strictfp etc... ||
* final은 C에서 const와 같은 것이다. * final 변수를 만들고 그 변수를 생성자 안에서 초기화를 하면 객체마다 가격을 지정하면서 가격이 변하지 않게 할 수 있다.
* static은 instant하지 않고도 쓸 수 있는 것. static이 붙은 변수를 클래스 변수라고 한다.
* static final은 static과 final의 합쳐진 형태로 모두가 필요하나 값이 변하면 안되는 상수 같은 경우에 쓰인다. (Ex : PI)
* abstract는 내용 여부를 정확히 모를 때 일단 형태만 만들어 놓고 나중에 가져다 쓰는것.
* class를 추상화 하는 것이 아니라 사실 메서드에 쓰는 것이다. class 앞에 붙은 이유는 그 클래스 안에 abstract method가 있다고 나타내는 것이다.
* final 변수를 선언만 한 후 생성자에서 final 변수를 초기화해서 객체마다 다른 상수를 만들 수 있다.
* static은 instant하지 않고도 쓸 수 있는 것. static이 붙은 변수와 메서드를 클래스 변수, 메서드라고 한다.
* static final은 static과 final의 합쳐진 형태로 인스턴스하지 않고 쉽게 참조하는 상수가 필요한 같은 경우에 쓰인다. (Ex : Math.PI())
* abstract는 내용 여부를 정확히 모를 때 일단 형태(몸통)만 만들어 놓고 나중에 가져다 쓰는 것
* 사용방법 예 : 위의 mp3 클래스의 재생,정지 등의 메서드를 abstract로 몸통만 만들어서 각각의 자손 클래스를 설계하는데 사용한다.
* abstract class는 그 클래스 안에 abstract method가 있다고 나타내는 것이다.
* abstract는 같은 클래스 내에서 설정을 하지 못하며 다른 클래스에서 무조건 오버 라이딩을 해줘야한다.* 그래서 abstract는 private로 설정 할 수 없다.
|| || 같은 클래스 || 같은 패키지 || 자손 클래스|| 전체 ||
|| || 같은 클래스 || 같은 패키지 || 자손 클래스|| 전체 ||
||public || ○ || ○ || ○ || ○ || ||protected || ○ || ○ || ○ || ||
||package || ○ || ○ || || ||
||private || ○ || || || ||
||protected || ○ || ○ || ○ || ||
||package || ○ || ○ || || ||
||private || ○ || || || ||
{{{
제어자 조합
1. static과 abstract는 같이 쓸 수 없다. 메모리에 로드 되면서 static은 로드 될 내용이 필요한데 abstract는 형태만 잡는 것이기 때문이다.
2. private와 abstract 또한 같이 쓸 수 없다. abstract는 상속을 통해 기능을 완성시켜야 하지만 private로 접근을 막아버리는 것은 모순되는 것이기 때문이다. (abstract 사용방법에 자세한 설명 참조)
3. private와 final을 같이 쓸 필요가 없다. 조상 클래스에서 final private로 메소드를 만들면 애초에 private에 의해 오버라이딩을 할 수 없기 때문에 할 필요가 없다.
4. 클래스가 abstract와 final을 동시에 사용할 수 없다. final은 클래스가 확장할 수 없다는 의미이고 abstract는 상속을 통해 완성된다는 의미이므로 모순되기 때문이다.
}}}
* 캡슐화 : privated 또는 protected(대부분 privated)로 변수나 메서드를 모두 씌워서 접근 제한을 두는 것. 그리고 이를 get~이나 set~로 접근을 하는 것이다.
* '''캡슐화''' : private 또는 protected(대부분 private)로 변수나 메서드를 '''접근 제한'''을 두고 get,set 메서드로 접근하게 하는 것이다.
* 그렇기에 get, set은 public으로 한다. * 생성자도 특수한 메서드이기 때문에 캡슐화에 포함된다.
* 생성자도 '''메서드'''이기 때문에 캡슐화에 포함된다.
* 그렇기에 메서드를 이용해 생성자를 선언 할수도 있다.{{{
class Car{private static Car A = new Car();
private car(){}
@@ -113,12 +124,8 @@
Car A;
A = Car.newCar();
}}}
* 위와 같은 과정을 통해 메서드를 이용해 생성자를 선언한다.
* static과 abstract는 같이 쓸 수 없다. static은 내용이 있어야 하는 것이고 abstract는 형태만 잡는 것이기 때문이다.
* abstract와 final도 같이 쓸 수 없다. abstract는 상속을 통해 기능을 완성시키지만 final은 처음에 설정한 것을 나중에 수정을 하지 못하게 하기 때문이다.
* private와 abstract 또한 같이 쓸 수 없다. abstract는 상속을 통해 기능을 완성시켜야 하지만 private로 접근을 막아버리는 것은 모순되는 것이기 때문이다.
* 마지막으로 private와 final을 같이 쓸 수 필요가 없다. 조상 클래스에서 final private로 메소드를 만들면 애초에 private에 의해 오버라이딩을 할 수 없기 때문에 할 필요가 없다.
== 다음 진행 ==
* Chapter 7-5~7 다형성,추상,인터페이스
* 발표 : 유재범
A = Car.newCar();
}}}
* Chapter 7-5~7 다형성,추상,인터페이스
* 발표 : 유재범
3.1. 발표 내용 ¶
- 상속(Inheritance) : 상속을 받은 자손 클래스는 상속을 해준 조상 클래스의 메서드나 변수를 쓸 수 있다.
- 재사용(재활용)을 통해서 코드가 간결해지는 장점이 있다.
- 상속 시 생성자의 순서는 부모 클래스 -> 자손 클래스이다.(super()에서 자세한 설명)
- JAVA는 단일 상속만 지원한다.(C++는 다중 상속을 지원한다.)
- 인터페이스를 통해 단일 상속을 보완할 수 있다.
- 다중 상속의 문제점은 자손 클래스에서 어느 한 메서드나 변수를 가져 올 때 서로 다른 조상 클래스에서 같은 이름을 가진 메서드나 변수가 있다면 이것들이 어디서 오는건지 몰라서 문제가 생기기 때문이다.
- 인터페이스를 통해 단일 상속을 보완할 수 있다.
- 재사용(재활용)을 통해서 코드가 간결해지는 장점이 있다.
class 상속받는 클래스 extends 상속하는 클래스 Ex) class Car{ } class Taxi extends Car{ }
- Object class : 최상위 클래스이다. 상속 받는 클래스가 없다면 그 클래스는 Object class에게 상속을 받는다.
- 위의 예시의 Car 클래스도 이미 Object class에게 상속받고 있다. 따로 입력을 해주지 않아도 컴파일러 단계에서 붙여준다.
class Car extends Object{ }
- 11가지의 메서드를 기본적으로 가지고 있다. (toString(),equals() 등등)
- 위의 예시의 Car 클래스도 이미 Object class에게 상속받고 있다. 따로 입력을 해주지 않아도 컴파일러 단계에서 붙여준다.
- 오버 라이딩
- 조상 클래스에서 정의된 메서드를 자손 클래스에 재정의하는 것을 말한다.
- 쓰는 이유 : mp3라는 클래스에 재생 메서드가 있다면 아이팟, 갤럭시플레이어 등 다양한 플레이어에서 각각의 다른 재생 메서드가 필요하므로 각 자손 클래스에서 재생 메서드를 오버 라이딩해서 사용한다.
- 오버 라이딩은 이름, 매개변수, return 타입이 같아야한다.
- 오버로딩과 비교하자면 오버로딩은 기능을 추가하는 것이라면 오버 라이딩은 내용을 수정하는 것이다.
- 자손 클래스에서 오버 라이딩을 하면 조상 클래스의 메서드를 은닉을 할 수 있다.(은닉화)
- 조상 클래스에서 정의된 메서드를 자손 클래스에 재정의하는 것을 말한다.
오버라이딩의 규칙 1. 오버라이딩 할 때에는 접근 제한자의 범위가 조상 클래스의 메서드보다 같거나 커야한다. (private < package < protected < public) 즉 조상 클래스 메서드가 private 메서드이면 오버라이딩을 할 수 없다. 2. 오버라이딩 된 하위 클래스의 메서드는 throws 구문이 있으면 상위 클래스의 오버라이딩을 준 메서드도 반드시 해 당 예외 클래스를 준하는 throws 구문이 있어야 한다. 3. 예외 처리는 자손 클래스가 조상 클래스보다 더 많이 할 수 없다. 4. static 메서드를 조상 클래스에서 인스턴스 메서드로 오버라이딩이 불가능하다.
- super : 조상 클래스를 따라가는 this와 같은 것.(명시적)
- this는 자신 클래스 안의 것을 가리키다면 super()는 조상 클래스의 변수나 메소드를 가리 킬 때 쓰는 것이다.
- 만일 조상 클래스에만 있는 변수 x가 있다면 자손 클래스에서 this.x로 참조가 가능하지만 super.x로 함으로 명시적으로 표현하자.
- private가 걸린 변수나 메소드는 참조 불가(private는 깡패! get,set메서드를 사용하자)
- super()는 상위 클래스의 생성자를 가리 킬때도 쓰인다.
- this는 자신 클래스 안의 것을 가리키다면 super()는 조상 클래스의 변수나 메소드를 가리 킬 때 쓰는 것이다.
class Car{ Car(){ } } class Taxi extends Car{ Taxi(){ super(); } } super() = Car() 쉽게 super()를 Car 생성자 메서드라고 생각하면 된다. 주의! : 자손 클래스의 생성자안에서 맨 앞에 super();가 있어야한다. 왜냐하면 부모 클래스가 미리 메모리에 적재되어야 자손클래스가 적재할수 있기 때문이다.
- Package : 클래스가 .class 확장자의 파일인 것 처럼 패키지는 사실 물리적으로 디렉토리이다.
- 이클립스에서 패키지를 만들고 그 안에 클래스를 만들면 그 클래스 제일 위에 폴더 이름이 나타난다.
- import 패키지명.클래스. *
- *(Asterisk, 와일드 카드) : 패키지 안, 클래스 안 모든 메서드를 다 쓰겠다는 것.
- *(Asterisk, 와일드 카드) : 패키지 안, 클래스 안 모든 메서드를 다 쓰겠다는 것.
- 이클립스에서 패키지를 만들고 그 안에 클래스를 만들면 그 클래스 제일 위에 폴더 이름이 나타난다.
class 파일 구조 package 패키지명; import 패키지명.클래스. * public class 클래스명 { 생 략...}
- 제어자 : 접근 권한을 제어하는 것.
접근 제어자 public, protected, default, private 그 외 static, final, abstract, native, transient, synchronized, volatile, strictfp etc... - final은 C에서 const와 같은 것이다.
- final 변수를 선언만 한 후 생성자에서 final 변수를 초기화해서 객체마다 다른 상수를 만들 수 있다.
- final 변수를 선언만 한 후 생성자에서 final 변수를 초기화해서 객체마다 다른 상수를 만들 수 있다.
- static은 instant하지 않고도 쓸 수 있는 것. static이 붙은 변수와 메서드를 클래스 변수, 메서드라고 한다.
- static final은 static과 final의 합쳐진 형태로 인스턴스하지 않고 쉽게 참조하는 상수가 필요한 같은 경우에 쓰인다. (Ex : Math.PI())
- abstract는 내용 여부를 정확히 모를 때 일단 형태(몸통)만 만들어 놓고 나중에 가져다 쓰는 것
- 사용방법 예 : 위의 mp3 클래스의 재생,정지 등의 메서드를 abstract로 몸통만 만들어서 각각의 자손 클래스를 설계하는데 사용한다.
- abstract class는 그 클래스 안에 abstract method가 있다고 나타내는 것이다.
- abstract는 같은 클래스 내에서 설정을 하지 못하며 다른 클래스에서 무조건 오버 라이딩을 해줘야한다.
- 그래서 abstract는 private로 설정 할 수 없다.
- 그래서 abstract는 private로 설정 할 수 없다.
- 사용방법 예 : 위의 mp3 클래스의 재생,정지 등의 메서드를 abstract로 몸통만 만들어서 각각의 자손 클래스를 설계하는데 사용한다.
- final은 C에서 const와 같은 것이다.
같은 클래스 | 같은 패키지 | 자손 클래스 | 전체 | |
public | ○ | ○ | ○ | ○ |
protected | ○ | ○ | ○ | |
package | ○ | ○ | ||
private | ○ |
제어자 조합 1. static과 abstract는 같이 쓸 수 없다. 메모리에 로드 되면서 static은 로드 될 내용이 필요한데 abstract는 형태만 잡는 것이기 때문이다. 2. private와 abstract 또한 같이 쓸 수 없다. abstract는 상속을 통해 기능을 완성시켜야 하지만 private로 접근을 막아버리는 것은 모순되는 것이기 때문이다. (abstract 사용방법에 자세한 설명 참조) 3. private와 final을 같이 쓸 필요가 없다. 조상 클래스에서 final private로 메소드를 만들면 애초에 private에 의해 오버라이딩을 할 수 없기 때문에 할 필요가 없다. 4. 클래스가 abstract와 final을 동시에 사용할 수 없다. final은 클래스가 확장할 수 없다는 의미이고 abstract는 상속을 통해 완성된다는 의미이므로 모순되기 때문이다.
- 캡슐화 : private 또는 protected(대부분 private)로 변수나 메서드를 접근 제한을 두고 get,set 메서드로 접근하게 하는 것이다.
- 그렇기에 get, set은 public으로 한다.
- 생성자도 메서드이기 때문에 캡슐화에 포함된다.
- 그렇기에 메서드를 이용해 생성자를 선언 할수도 있다.
- 그렇기에 메서드를 이용해 생성자를 선언 할수도 있다.
- 그렇기에 get, set은 public으로 한다.
class Car{ private static Car A = new Car(); private car(){} public static Car new Car(){ return A } main class>> Car A; A = Car.newCar();