접근레벨 지정자
- 클래스,인터페이스, 멤버에 대한 접근 영역을 제한 하기위해 사용
- class 레벨
- public (ex-public enum / public class)
- 패키지 밖에서 접근가능
- package-private(default)
- 패키지 안에서만 접근가능
- 멤버 레벨 (클래스 또는 인터페이스 내의 멤버에 대한 접근영역 제한)
- public - 어디서든 접근
- protected - 패키지내, 패키지외에서는 상속관계인 경우만 접근가능
- package-private(default) - 해당패키지 내에서만 접근
- private - 멤버가 선언된 클래스 내에서만 접근
영역 - 패키지내, 패키지외, 멤버선언클래스, 상속관계클래스
(빨간색- 접근불가)
1.같은패키지 같은클래스
all OK
2.같은패키지내(좌측하단)
같은 패키지지만 private 변수엔 접근불가.(상속을 했는데도)
3.다른패키지
public만 접근가능
4.다른패키지 but 상속받은클래스
public,protected →OK
default,private → 접근불가
- 관계
- 사용관계 - import
- 상속관계 - extends
* 접근제한자
private - 해당 class 내에서만 접근가능
default - 접근제한자가 지정되지 않은경우.같은 package 내에서만 접근가능
protected - 같은 package 접근가능/다른package서는 자식class에서만 접근가능
public - 어디서든 접근가능.
-----------------------------------------------------------------
상속
- 클래스를 다른 클래스로부터 파생하는것- 클래스의 코드(필드와 메서드)를 재사용
수퍼클래스 → 서브클래스
Base클래스 → Extented클래스
부모클래스 → 자식클래스
- 자식클래스는 부모클래스로부터
- 모든 public,protected멤버 상속(생성자 제외)
- 같은 패키지내, 혹은 상속관계에 있는경우
- 같은 패키지에 있으면
- package-private( = default) 멤버 상속
서브클래스 정의
- extends키워드와 부모클래스명을 사용- 상속받은 멤버를 사용, 숨기거나, 대체가능
형식) [지시어]class 클래스명 extends 슈퍼클래스명 {
...
}
상속받은 필드와 메서드 사용
- 상속받은 필드와 메서드를 사용
class Person {
private String name;
int age;
public void setName(String name) {
this.name;
}
public void getName() {
return name;
}
}
class Student extens Person {
public void print() {
System.out.println(getName());//부모의 메서드 사용.
System.out.println(age); //부모의 age사용.
}
}서브클래스 정의2
- 서브클래스에서는 (아래 1~5)- 새로운 이름의 필드와 메서드 추가
- class Person {private String name;int age;public void setName(String name) {this.name;}public void getName() {return name;}}class Student extens Person {}
Sting sid;//학번 추가
//setter 추가
public void setSid(String sid) {
this.sid = sid;
} - 동일한 이름의 필드 선언.재정의(숨기기)
- class A {
- int n = 10;
- }
- class B extends A {
- int n=20; //동일한 이름으로 변수 선언
- public void print() {
- System.out.println(n);
- }
- }
- new B.print(); //20
- System.out.println(new B().n);//20 자식클래스에선 부모필드는 숨겨진다.
- 동일한 이름의 static메서드 재정의(숨기기)
- class A{
- static int a=1;
- public static void printStatic() {
- System.out.println("A:"+a);
- }
- }
- class B extends A {
- static int a=2;
- public static void printStatic() { //동일한 이름으로 static메서드 선언
- System.out.println("B:"+a);
- }
- }
- B.printStatic();//B:2
- 동일한 이름의 instatce 메서드 재정의(override) => 자식을 통한 부모메서드 접근X
- class Person {
- public void sayHi() {
- System.out.print("안녕하셈");
- }
- }
- class Student extends Person{
- public void sayHi(){ //override
- System.out.println("안녕~");
- }
- }
- new Student().sayHi(); //안녕~
- super()를 이용한 생성자.(-- 부모로부터 상속받은 생성자 초기화에 사용)
- class Person {
- String name;
- int age;
- Person(String name,int age) {//생성자
- this.name=name;
- this.age = age;
- }
- }
- class Student extends Person{
- int sid;
- int age = 20; //부모와 동일한 변수 선언.
- Student(String name,int age,int sid) {//생성자
- super(); //super() 생성자
- this.sid = sid;
- }
- public void print() {
- System.out.print(this.age+","+super.age); //super reference
- // 자식age , 부모age 출력
- }
- }
@@ 실습 p203
서브클래스 정의3
- private 멤버에 대한 간접 access만 가능.(getter)- 이 멤버에 접근하는 public or protected 메서드들을 통하여
- 상속받은 nested class를 통하여(클래스내 클래스-중첩클래스)
Override
- 서브클래스에서 슈퍼클래스의 메서드를 재정의 하여 사용하는 방법- 조건: (접근레벨지시자/Exception은 제외하고 상속)
- 상속관계
- 메서드 이름이 동일
- 메서드 인자 리스트가 동일
- 메서드 리턴타입이 동일
- - 접근 지정자는 확대만 가능
- - 더 많은 예외를 가질 수 없음.(동일하거나 더 적은 예외)
- static,final,private 지정자를 가진 메서드는 오버라이드 할 수 없다.
(cf - static 메서드는 숨기기만 가능. 나머지는 다 안됨.)
(cf - static 메서드는 숨기기만 가능. 나머지는 다 안됨.)
Overriding 와 Overrloading 비교
- 오버라이딩 :
- 상속관계에서, 상속받은 메서드의 내용을 재정의 하는것.
- 오버로딩 :
- 같은 클래스내에서, 새로운 메서드(매개변수의 타입,갯수,순서가 다른)를 만드는 것.
super()
- 슈퍼클래스의 생성자를 호출할 때 사용
- 슈퍼클래스 멤버의 생성과 초기화 작업이 수행되어야 하기 때문
- 생성자의 첫줄에서 super()를 호출해야. 그렇지 않은 경우, 컴파일러가 자동으로 super()를 추가함.
==> 부모클래스에 기본생성자가 없다면 super() 에러..
- 매개변수가 있는 super 생성자를 사용하는 경우, 컴파일러는 기본 super()생성자를 추가하지 않음.
* 부모클래스의 생성자가 호출되어야
상속
subclass의 객체의 생성과 형변한
- new키워드를 이용한 생성
- 객체의 형변환과 상속을 이용하여 reference를 부모클래스 타입의 참조변수에 저장할 수 있음.
- 객체의 형변환과 상속을 이용하여 reference를 부모클래스 타입의 참조변수에 저장할 수 있음.
예) Person p = new Student();//자동형변환 (Up-casting)
Student s = (Student)p; //명시적 형변환(Down-casting)
*부모클래스 객체를 자식클래스로 형변환=> 대개 실행시에러(why? 자식은 확장되어 있거든)
- instanceof - reference를 특정타입으로 캐스팅 할수있는지 판단해주는 연산자
- 예: 참조변수 instanceof 캐스팅할 타입
Person person1 = president1;
if(person1 instanceof President){
President president2 = (President)person1;
System.out.println("person1 을 President 타입으로 캐스팅 성공");
}
*부모클래스 객체를 자식클래스로 형변환=> 대개 실행시에러(why? 자식은 확장되어 있거든)
- instanceof - reference를 특정타입으로 캐스팅 할수있는지 판단해주는 연산자
- 예: 참조변수 instanceof 캐스팅할 타입
Person person1 = president1;
if(person1 instanceof President){
President president2 = (President)person1;
System.out.println("person1 을 President 타입으로 캐스팅 성공");
}
다형성 (Polymorphism)
- 하나의 interface를 사용해서 여러 데이터 타입을 다룰 수 있는 능력- 상속 ,override를 이용해서 다형성 제공
예) Person p = new Student(); //부모형 자식객체 생성
p.sayHi();//안녕~,override되었음 ==> 타입 폴리머피즘. 자식의 메서드 실행
(Student)p.sayHi();//안녕~
- 파라미터의 다형성1
- Person
- ↙ ↘
- Student , Employee
class Person {
public void test() {
System.out.print("안녕하셈");
}
}
class Student extends Person{
public void test(){ //override
System.out.println("안녕~");
}
}
class Employee extends Person{
public void test(){ //override
System.out.println("안녕하십니까!");
}
}
- 파라미터의 다형성2
class MikeTest{
public void test(Person p) {
p.sayHi();
}
public static void main(String args[]) {
MikeTest mike = new Test();
//Person 이 Student , Employee 등 여러개의 데이터형을 다룰수 있다=> 다형성
mike.test(new Student()); //안녕~
mike.test(new Employee()); //안녕하십니까!
public void test(){ //override
System.out.println("안녕하십니까!");
}
}
- 파라미터의 다형성2
class MikeTest{
public void test(Person p) {
p.sayHi();
}
public static void main(String args[]) {
MikeTest mike = new Test();
//Person 이 Student , Employee 등 여러개의 데이터형을 다룰수 있다=> 다형성
mike.test(new Student()); //안녕~
mike.test(new Employee()); //안녕하십니까!
}
}상속 - 배열의 다형성
class TestArray{public static void main(String args[]) {
Person[] p = new Person[2];
p[0] = new Student();
p[1] = new Employee();
for(int i=0;i<p.length;ㅑ++) {
p[i].sayHi(); //안녕~,안녕하십니까! : 자식메서드 실행
}
}
}
@@ 실습 p215
Object 클래스
- java.lang 패키지의 Object클래스는 class hierarchy tree의 최상단에 위치함.- 모든 클래스는 Object의 instance메서드(멤버)를 상속
(notify,notifyAll,clone,equals,finalize,getClass,hashCode,toString)
final
- 더 이상 변경될 수 없다는 것을 선언한다.
- final 키워드가 사용가능한 곳 / 의미
- 필드 - 변경불가
- 메서드 - override 불가
- 클래스 - 상속불가.
@실습 p211,212
[문제1] 패키지
package외부에서 public package멤버를 사용하기위한 3가지 방법?
http://blog.daum.net/sweetheev/3346269
답)
- import 패키기상세
- import 패키지.*
- fully qualified name 접근
[문제2] 접근제어자
접근범위가 넓은것에서 좁은 순서
public > protected > (default) > private
[문제3] 접근제어자
1. 부모클래스의 private멤버는 접근할 수 있다. x
2. 같은 package내에서는, public과 protected멤버인 경우 접근가능하다. x
- (default도 있다)
3. 다른 패키지의 클래스 상속인 경우는 default 멤버는 사용 할 수 없다. o
- 디폴트는 같은 패키지 내에서만 접근가능.
4. public 메서드는 어디에서도 접근가능하다. o
[문제4]서브클래스의 메서드
3번째 x A:static B:인스턴스 허용불가
4번째 o .
[문제] override 조건으로 틀린것은? ( 4 )
- 이름이 같아야한다 o
- 매개변수의 수와 타입이 같아야 한다 o
- 리턴타입이 같아야 한다 o
- 접근제어자는 좁은 범위로만 변경할 수 있다 x
- 더 많은 예외를 선언할 수 없다. o
[문제] 형변환 바른것은? a, b
a- up casting : 자동형변환 되지만 - 형변환 연산자 붙여도 무관.
b- up casting : 자동형변환
c- 확장된 자식에 부모객체를 대입하면, 확장된 내용을 사용불가.
[문제6] instanceof
결과가 ture가 아닌 것? 3 (형변환이 가능한 경우 - upcasting)
A a=new A();
B b=new B();
C c=new C();
- c instanceof B //?
- b instanceof C //?
- a instanceof B //?
- b instanceof A //?
- c instanceof A //?
UPCASTING 가능 - 2,4
3 - A의 객체 a를 B에 대입할수 있나? B는 확장됨 => 형변환불가
a instanceof C 도 마찬가지.[문제7] 생성자
Student 클래스는 Person의 클래스를 상속받고 있다.
Student 의 생성자를 완성하기.
class Person {
String name;
int age;
Person(String name, int age) {
this.name = name;
this.age = age;
}
}
class Student extends Person
{
int sid;
Student(int sid,String name, int age) {
//생성자 완성?
super(name,age);
[문제8] 상속과 다형성this.sid = sid;} }
override 해야될 메서드?
class SchoolNewsPaper {
public String getInfo(Object o) {
return (o==null)?null:o.toString();
}
...
}
sol) getInfo() 메서드-Student 클래스 객체 받을수 있어.
==> toString() 을 오버라이드 해야






댓글 없음:
댓글 쓰기