개발자의 오르막
SW 심화과정 교육 3일차 본문
# Java 클래스의 특성
# 객체지향 언어의 3대 속성
1. 상속성 : 클래스를 상속해서 클래스를 만들 수 있다.
2. 은닉성 : 감추고 싶은건 감출 수 있다.
3. 다형성 : 하나의 심볼(이름)이 여러 실체에 매핑될 수 있다.
# 상속성
- 에러가 안나는 이유
→ 참조형 변수를 선언하여, 클래스 B 인스턴스를 생성했다. 이때 B가 A를 상속받음으로
A의 멤버 변수 및 멤버 함수를 사용 가능하다.
따라서 메인 클래스에서 출력함수일 때, B 인스턴스를 통해서 A의 멤버변수를 출력할 수 있다.
- 클래스가 할 수 있는 기능
1) 참조형 변수를 선언
2) 인스턴스 생성
3) 상속받아 클래스를 선언
- this
→ this는 인스턴스를 생성하는 참조형 변수를 가리킨다.
→ 즉, t 인스턴스와 l 인스턴스를 구분하여 상이한 값을 출력한다.
- Node
- 이 코드가 추가 될 때
→ 즉, t.next의 값이 가리키는 대상이 있는 2번째, 3번째 공간의 data를 출력한다.
가리키는 대상이 없을 때는 초기값인 null이 적용되어 있다.
# 자바 연결리스트
- LinkedList 생성자를 호출해 Node 인스턴스를 생성해 구조체의 형식을 만든다.
- 생성자에서 멤버변수가 어떤 인스턴스를 가리킬지 정의해준다.
(head는 새로운 Node 인스턴스를 가리키고, tail이 그 인스턴스를 가리키게 함)
- add함수는 data 매개변수를 갖는 새로운 Node 를 생성하고,
멤버함수의 tail.next가 생성된 인스턴스를 가리키게 하는 함수
- print 함수는 각각의 data를 출력한다. (data값을 갖는 인스턴스만)
# 자바 상속
- 상속관계가 존재할 때 (조상클래스, 자손클래스)
- 자손의 인스턴스를 생성하면 조상의 생성자가 먼저 호출되고, 자손의 생성자가 호출된다.
- 생성자는 상속되지 않는다. 다만 호출될 뿐이다. 멤버함수도 아니다.
(참조형 변수로도 호출할 수 없다.)
- 생성자는 단지 호출될 뿐임으로, 조상클래스의 인스턴스가 생성되는 것은 아니다.
- B의 인스턴스를 생성하면, 조상의 생성자부터 호출된다.
A → B 생성자 호출
# 상속 오버라이딩
- 조상타입의 변수로 자손의 인스턴스를 가리킬 수 있다.
- 조상에서 선언된 멤버함수 멤버변수만 호출이 가능하다.
(인스턴스 안의 멤버변수 함수는 존재하나 호출 못함)
- 만일 오버라이딩 된 함수를 호출한다면 이때는 오버라이딩 된 것이 호출된다.
- 멤버변수에는 오버라이딩 개념이 없어서, 자손클래스에서 재정의해도 부모클래스 멤버변수가 호출된다.
# 접근지정자
1) 상속 X, 외부 노출 X, 내가 쓸 수는 있어야 함. : private
2) 상속 O, 외부 노출 X, 내가 쓸 수는 있어야 함. : protected
3) 상속 O, 외부 노출 O, 내가 쓸 수는 있어야 함. : public
- 클래스 안의 멤버 변수와 멤버 함수 앞에 붙여준다. → private, 은닉성
- java의 protected : 같은 패키지에서 접근 가능하나 다른 패키지에서는 접근 불가
- (앞에 아무것도 선언 X) friendly : 같은 패키지에서는 public 동작하고, 다른 패키지에서는 private 동작
- private 은 자손에서도 접근 못하고, 참조형 변수에서도 접근 못한다.
protected 는 같은 팀의 다른 클래스에게는 알려지지만, 다른 팀에 소속된 클래스는 접근 불가해야 한다.
후배에게 물려줄 때에는 당연히 접근 가능해야 한다.
→ 그러므로, get 함수를 사용하여 혼동을 방지한다.
- 멤버변수는 무조건 private 하게 선언한다.
- 값을 읽고자 할 때는 getter 함수를 이용하여 접근한다.
- A t = new B()에서 t.i 는 조상의 멤버변수가 나오고, t.print() 는 오버라이딩 된게 나옴
이런 일이 벌어지지 않게 되더라.
상속받는 자손에서는 부모 클래스의 멤버변수 이름을 사용하지 않는다. (혼란방지)
# abstract
- 위의 print 함수는 선언되었지만 정의되지 않았다. 반드시 abstract 붙여준다.
- abstract 메소드를 하나라도 가진 클래스는 반드시 abstract 클래스라고 정의해야 한다.
- abstract 클래스는 인스턴스를 만들 수 없다. 변수 선언, 상속은 가능하다.
- 위의 print 함수는 선언되었지만 정의되지 않았다. 반드시 abstract 붙여준다.
- abstract 메소드를 하나라도 가진 클래스는 반드시 abstract 클래스라고 정의해야 한다.
- abstract 클래스는 인스턴스를 만들 수 없다. 변수 선언, 상속은 가능하다.
- 조상의 t는 자손의 인스턴스를 가리킬 수 있다.
# abstract 동작 원리
- 생성자가 호출됬을 때 부모부터 자손까지 생성자가 차례로 호출된다.
- 이때 포인터 동작
- 이후 자손 클래스에서 부모 멤버함수를 오버라이딩 햇을 때
- 원래 A의 포인터를 B의 인스턴스로 위치 옮김
- abstract 는 부모의 포인터가 null 값인 채로 있다가 오버라이딩 된 인스턴스로 포인터 이동
- 조상의 포인터로 자손의 인스턴스를 가리킬 수 있다. (자손이 더 크니까)
- 자손 안에 있는 조상의 영역까지만 가리킨다.
- 조상의 참조형 변수를 이용해서 조상의 멤버변수, 멤버함수만 호출 가능
- 오버라이딩 되면 조상의 포인터가 자손의 인스턴스를 가리키게 이동된다.
- abstract의 멤버함수를 오버라이딩해서 메소드 형태를 갖추면 일반 클래스를 만들 수 있다.
- abstract를 상속받았을 때는 처음 null값이었지만, 자손의 인스턴스를 가리킬 수 있음으로
인스턴스를 생성할 수 있다.
- 함수 포인터가 비어있는 채로 인스턴스를 생성할 수 없다. (가리키는 대상이 null 이면 안된다.)
이때에는 abstract로 분류하여 인스턴스를 생성하지 못하게 해야 한다.
# abstract의 활용
- 자주 안 변하는 부분은 abstract로 만든다.
- c에서 구조체와 비슷하지만 java에서는 클래스 단위로 재활용되기 때문에 사용
- c에서 함수포인터를 바꿨을 때 함수 안의 모든 메소드를 활용해야 하지만
java 에서는 클래스의 인스턴스만 바꿔주면 선택적으로 메소드를 선택할 수 있다.
# interface의 특징
- 인터페이스에 선언된 method는 몽땅 abstract 해야 한다.
- 인터페이스를 상속해서 클래스를 선언할때는 implements를 이용해야 한다.
- 상속받은 클래스는 인터페이스에 선언된 메소드를 모두 오버라이딩 해야 한다.
- 인터페이스는 일종의 abstract 클래스이며 참조형 변수를 선언할 수 있고, 상속 당할 수 있다.
- 2개 이상의 인터페이스를 상속 받는 것 문제 없다.
- 동시에 클래스를 상속 받고, 인터페이스를 상속 받는 것도 가능하다.
# interface의 활용 - 객체화
- 오늘 과제
1) 나눠준 temp04.c 파일을 분석해서 java 와 비교해서 리포트 작성
'교육과정 ( SW 개발자 심화과정 ) > Java' 카테고리의 다른 글
SW 제주 심화 교육 - 코드 패턴 (0) | 2019.07.18 |
---|---|
SW 심화과정 교육 4일차 (0) | 2019.07.18 |
SW 심화과정 D-3 (0) | 2019.07.17 |
SW 심화과정 D-1 (0) | 2019.07.15 |
SW 심화과정 교육 1일차 (0) | 2019.07.15 |