본문 바로가기
JAVA

객체지향 프로그래밍

by Minius 2018. 3. 5.
반응형

1. 객체지향 프로그램 : 추상화, 캡슐화, 상속, 다형성

케이스별로 예제 1개씩 외우기.


1) 추상화 : 객체들의 공통적인 특징(속성과 기능)을 뽑아내는 것. 즉, 구현하려는 객체들이 가진 공통적인 데이터의 기능을 도출해 내는 것.


2) 캡슐화 : 객체의 내부 데이터(필드, 메소드)를 숨기는 특성. 직접변경 X, 객체 내 허용된 메소드를 통해서만 데이터 접근 가능.
                객체 외부에서


3) 상속 : 멤버변수, 상수, 메소드 상속 가능 / 생성자, private변수 상속 불가


조상 클래스 : <1.구현 클래스, 2.추상 클래스, 3.인터페이스> 가 될 수 있다.


(1) 구현 클래스 :  body가 있는 클래스. abstract 붙일 수 있음.

final된 class는 상속할 수 없다.(String class 등)

public final class String

object class는 final되어있지 않기 때문에 가능.

public class Object

직접 인스턴스를 생성할 수 없다. 상속한 자식 클래스에서 인스턴스 생성 할 수 있다.

타입사용 가능.


(2) 추상 클래스 :        클래스 안에 abstract가 하나라도 있으면 추상 클래스.

추상메서드,

상수,

정적 메서드(static method),

인스턴스메서드,

변수

접근제한자 아무거나 가능.

단일상속


(3) 인터페이스 :         구성멤버로

추상메서드,

상수(변수X_ 변수 앞에 붙이지 않아도 컴파일 시 final이 붙는다.),

정적 메서드(static method)=클래스메서드 =STATIC메서드, 디폴트 메서드=인스턴스 메서드(인스턴스화 해야 한다.)

디폴트 메서드 : 인스턴스화 해야 한다.

접근제한자는 무조건 public 멤버 모두 open.

다중상속

인터페이스 수정시 기존 인터페이스를 사용하던 클래스에서 변경된 것을 추가해줘야한다.

따라서 기존 것을 수정하지 않고 인터페이스를 수정하려면 정적메서드를 사용.





final : <1. 변수, 2. 메소드, 3. 클래스>에 붙일 수 있다.

1. 변수 : 상수를 만들 때.

2. 메소드 : 오버라이딩 불가하게 만들 때.

3. 클래스 : final시 부모 클래스로 올 수 없다.


4) 다형성 : 3가지 기술적 조건

(1) 상속 : 클래스, 인터페이스에서 상속이 일어나야 한다. (private과 생성자는 상속 불가하다.)

(2) 부모타입에 자식타입을 대입할 수 있지만, 반대로는 성립 불가하다. (자식타입에 부모타입을 대입할 수 없다.)

(3) 재정의(Overriding) : 다형성의 예.








2. abstract, interface 특징 및 차이점


(1) abstract의 특징

      • 타입으로 사용 가능, 다중상속이 불가능
      • 추상 메서드가 포함된 클래스는 반드시 추상클래스로 정의해야 한다.
      • 추상 클래스는 일반 클래스와 같이 멤버 변수 및 메서드를 포함할 수 있다.
      • 추상 클래스는 객체 생성에 사용할 수 없다. =>상속을 통해 자식클래서에서 구현후 생성해야한다.
      • 반드시 추상 클래스를 상속받는 클래스를 만든 후 추상 클래스에 선언된 모든 추상 메서드를 오버라이딩해서 구현해야 한다.


(2) interface의 특징

      • 타입으로 사용 가능, 다중상속 가능
      • 추상메소드디폴트메소드정적메소드 올 수 있다.
      • 일반 멤버 필드는 없고, public static final로 선언한 상수만 있다.
      • 추상 클래스와 마찬가지로 직접 객체를 생성하는 것은 불가능 (다만, Anonymous Inner Class 생성 형태로는 가능)
      • 다른 클래스로 구현할 때는 implements 키워드로 구현을 선언해야 한다.
      • 구현클래스에서 일부만 재정의할 경우 추상클래스로 선언해야한다. (abstract키워드 붙여야 한다.)
      • 인터페이스간 상속은 extends를 사용.


(3) abstract, interface의 차이점


추상클래스(abstract class)

인터페이스(interface)

목적

상속받아 기능 재사용

기능 추가 및 확장(overriding)

메소드 구현을 강제하여

인터페이스를 구현한 객체들에 대해 동일한 동작을 보장

차이점

단일상속(extends)

다중구현(implements)

인터페이스간 상속은 extends를 사용

변수,상수 모두 사용 가능

상수만 사용가능, 변수사용 불가

모든 멤버변수는 public static final

모든 멤버메소드는 public abstract

접근제한자 모두 public


상속성

다형성

공통점

   1. 타입으로 사용가능. 객체생성 불가능(자기 자신의 new를 사용해서 생성불가)

   2. 구현된 메소드를 가짐(인터페이스 JDK8버전부터 default,static메소드 포함가능)

   3. 결합도를 낮춤





3. 오버라이딩 / 오버로딩 성립 조건


오버라이딩 : 조상 클래스로부터 상속받은 메서드의 내용을 변경하는 것


오버라이딩의 조건 (ver.책)

자손클래스에서 오버라이딩하는 하는 메서드는 조상 클래스의 메서드와

- 이름이 같아야 한다.

- 매개변수가 같아야 한다.

- 반환타입이 같아야 한다.


조상 클래스의 메서드를 자손 클래스에서 오버라이딩 할 때

1. 접근 제어자를 조상 클래스의 메서드보다 좁은 범위로 변경할 수 없다.

2. 예외는 조상 클래스의 메서드보다 많이 선언할 수 없다.

3. 인스턴트 메서드를 static 메서드로 또는 그 반대로 변경할 수 없다.


조건 (ver.강사님)

1. 오버라이딩하는 메서드는 슈퍼클래스의 메서드와 메서드 구성요소가 모두 동일해야 한다.

2. 메서드 이름, 매개변수의 개수, 자료형 순서, 리턴타입이 동일해야 한다. (동일한 시그니처)

3. 이름 및 구조는 동일하나 실행 내용이 다르다.

4. 접근제한을 더 강하게 오버라이딩 불가.

- public을 default나 private으로 수정 불가

- 반대로 default는 public으로 수정 가능



class

선언부 같아야 / 접근제어자 같거나 넓어야 한다.

@Overriding 이유 : 선언부 오류 방지

interface

선언부같아야


오버로딩의 조건


1. 메서드 이름이 동일해야 한다.

2. 매개변수의 개수 또는 자료형 순서가 달라야 한다.

3. 매개변수는 같고 리턴타입이 다르다고 오버로딩이 성립되지 않는다.









4. 컬렉션 SET, MAP, LIST 특징


 이름

종류 

특징 

List


LinkedList

Stack

Vector
Arraylist


순서가 있는 데이터의 집합,

데이터의 중복을 허용한다.

Set

 HashSet

TreeSet

 

순서를 유지하지 않는 데이터의 집합,

데이터의 중복을 허용하지 않는다.


Map

HashMap

TreeMap

HashTable

Properties 

 

Key와 Value의 쌍으로 이루어진

데이터의 집합이다.

순서는 유지되지 않고,

키는 중복을 허용하지 않으며 

값의 중복을 허용한다. 



 이름

순서 

데이터중복 

 List

있음 

허용 

Set 

없음 

불가 

Map 

없음 

키(허용) / 값(불가) 





5. 쓰레드 생명주기

(1) 쓰레드는 생성 - 실행 / 차단 / 대기 - 종료 순으로 설명된다.

실행 : Thread.start() 가 호출될 때 실행 될 준비가 된다.(Runnable 상태 - 스케줄러가 실행을 위해 쓰레드를 선택하면 run()이 호출 된다.)

차단/대기 : Thread.sleep()이나 Thread.yield()가 불렸을 경우 대기/차단한다.

wait() 메서드 실행시, waitpool에서 대기하다 notify() 메서드 실행시 다시 실행

종료 : run()이 종료되면 쓰레드가 종료되고 쓰레드 자원이 해지된다.


(2) 생성방법 2가지

1. Thread 클래스를 상속하여 생성

2. Runnable 인터페이스를 구현







6. 예외처리 2가지 방법

1. 직접처리 : try-catch (오류가 나는 줄을 try-catch문으로 감싼다.)

 상위타입이 밑에 있어야 한다.

2. 선언처리 : throws exception (현재 영역에서 직접 처리하지 않고 호출한 곳에서 예외 처리)


오류가 나도 종료없이 작동하기 위해


throw

throws





7. 접근제어자 범위


접근제어자 범위에 대한 이미지 검색결과

public : 접근 제한 없음

protected : 같은 패키지 내, 다른 패키지의 자손 클래스에서 접근 가능

default : 같은 패키지 내에서 접근 가능

private : 같은 클래스 내에서 접근 가능


 제어자

같은 클래스 

같은 패키지 

자손클래스 

전체

public

 

 

 

 

protected

 

 

 

 

default

 

 

 

 

private

 

 

 

 








8. this , this() , super , super()


1) this : 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있음.

           2) this() : 같은 클래스의 다른 생성자를 호출하는 데 사용됨.

           3) super : 자식클래스에서 부모클래스로부터 상속받은 멤버를 참조하는 데 사용되는 참조변수.

           4) super() : 부모클래스의 생성자를 호출하는 데 사용됨.







9. static의 쓰임새


1. static을 사용하면 프로그램이 시작할 때 바로 메모리를 확보한다. 따라서 객체를 선언하지 않고 변수나 메서드를 사용할 수 있다.

2. static이 붙으면 클래스 소속, 붙지 않으면 객체 소속

3. static이 붙은 멤버변수, 메서드를 공유할 때 주로 쓴다.


인스턴스 메서드와 static 메서드의 근본적인 차이는 메서드 내에서 인스턴스 멤버를 사용하는가의 여부에 있다.

static이 사용될 수 있는 곳 - 멤버변수, 메서드, 초기화 블럭

어떨 때 쓰는가? 공유, 


멤버변수 - 모든 인스턴스에 공통적으로 사용되는 클래스변수가 된다.

 - 클래스변수는 인스턴스를 생성하지 않고도 사용 가능하다.

 - 클래스가 메모리에 로드될 때 생성된다.

메서드    - 인스턴스를 생성하지 않고도 호출이 가능한 static 메서드가 된다.

 - static 메서드 내에서는 인스턴스 멤버들을 직접 사용할 수 없다.


class a{

멤버필드 - 인스턴스 필드                        - 상수

 - 정적(static) 필드(클래스 필드)    - 변수

멤버메소드

}


필드 : 상수 or 변수




10. 제너릭


클래스, 인터페이스, 메서드 내부에서 사용할 데이터 타입을 외부에서 지정해주는 방법

컴파일단계에서 잘못된타입 사용될 수 있는 문제 제거 가능

제네릭을 모르면 API DOC 해석 어려우므로 학습 필요




제네릭을 사용하는 코드의 이점

-런타임시 타입 에러 방지

-컴파일 시에 미리 타입을 강하게 체크해서 에러 사전 방지

-타입 변환 제거 가능

-강제형변환 필요 X



Generic type<?> : 제한 없음

Generic type<? extends 상위타입> : 상위 클래스 제한 (와일드 카드의 상한 제한, ?와 그 자손들만 가능)

Generic type<? super 하위타입> : 하위 클래스 제한 (와일드 카드의 하한 제한, ?와 그 조상들만 가능)


11. final


class a{

멤버필드 - 인스턴스 필드                        - 상수

 - 정적(static) 필드(클래스 필드)    - 변수

멤버메소드

}


필드 : 상수 or 변수


final 인스턴스 필드 : 인스턴스 단위의 상수

final static 필드     :  클래스 단위의 상수


final 메소드 : 부모 메서드가 될 수 없다. 상속 or 오버라이딩 불가능





위 사항을 자신이 정리 및 표현을 할 수 있어야 한다.

이러한 개념들을 놓치면 계속 헷갈림.

'JAVA' 카테고리의 다른 글

Static  (0) 2018.03.14
Thread  (0) 2018.03.08
Sort  (0) 2018.02.20
이름 나이 오름차순 내림차순  (0) 2018.02.20
배열 정렬  (0) 2018.02.20

댓글