0. 객체지향 프로그래밍(OOP)
1) 객체지향프로그래밍 (Object-Oriented Programming)
-단순히 데이터와 처리 방법으로 나누는 것이 아닌 수 많은 ‘객체’라는 기본 단위로 나누고 객체들의 상호작용으로 서술하는 방식
2) 특징
- 캡슐화
- 상속
- 추상화
- 다형성
1. 객체와 인스턴스
1) 객체
- 사물 또는 개념을 의미
- 클래스: 객체를 만들기 위한 틀
- 변수: 객체의 속성
- 메소드: 객체의 기능
2) 인스턴스
- 클래스 내 각각의 객체를 의미
- 클래스는 인스턴스들의 집합 / 인스턴스 변수는 인스턴스의 속성
- new 연산자에 의해 참조변수 선언 시 Heap에 인스턴스 생성
2. 변수의 분류
1) 멤버변수(cv, iv)
- 클래스 내에 선언된 변수
- 클래스 변수와 인스턴스 변수로 구분
- 변수값 자동 초기화
*멤버란: 클래스 내의 멤버변수와 메소드를 포함하는 개념
2) 지역변수(lv)
- 메소드 영역에서 선언된 변수이며 메소드 종료와 함께 소멸
- 변수값 초기화 필수
3. 클래스 변수와 인스턴스 변수
1) 클래스 변수(cv)
- 클래스 내의 모든 인스턴스들이 공유하는 변수
- 클래스명.변수명으로 접근
2) 인스턴스변수(iv)
- 인스턴스의 개별적인 저장공간
- 참조변수.인스턴스 변수명으로 접근
4. 참조변수와 매개변수
1) 참조변수
- 인스턴스를 생성하기 위해 사용
- 클래스명 참조변수명 = new 클래스명(초기화값);
2) 매개변수
- 메소드 실행시 필요한 데이터를 외부로 부터 받기 위함
- 매개변수도 변수의 일종이라 데이터 타입과 함께 선언(초기화 불필요)
*ex) GetHP(int a, int b) {}
3) 참조변수를 매개변수로 사용
- 메소드를 생성할 때 매개변수로 참조변수를 선언할 수 있다.
- 클래스가 가진 멤버를 사용할 수 있다.(해당 클래스 혹은 자손 클래스)
*ex) GetCoffee(Custom s) {} 으로 선언시 Custom 클래스의 변수를 메소드 내에서 사용 가능
4) 참조변수 this
- 해당 클래스의 멤버를 참조
- 인스턴스의 주소가 저장되어 있음
- 양식: this.멤버
*주의: 생성자 호출 this(); 와 사용을 달리한다.
5) 참조변수 super
- 부모 클래스의 멤버를 참조, 부모 멤버와 자손 멤버 구별에 사용
- 양식: super.부모의 멤버 (미입력시 자동입력)
5. 메소드
1) 메소드란
- 객체가 가져야할 기능을 구현
- /*제어범위, 반환유형*/ 메소드명 (매개변수); {}
2) return문
- 메소드를 종료하고 값을 반환
- 생성자 혹은 반환유형이 void면 return값이 없다.
3) 호출방법
- 참조변수.메소드명(매개변수);
4) 클래스 메소드(static)
- 인스턴스 없이 클래스명.메소드명으로 호출 가능
- 메소드 내에 인스턴스 변수 사용 불가
6. 오버로딩과 오버라이딩
1) 오버로딩
- 하나의 클래스에 동일명의 메소드를 여러 개 정의
- 매개변수의 개수, 타입, 순서가 중 하나라도 상이해야 함
2) 오버라이딩
- 부모 클래스의 메소드 속성을 자손 클래스에 맞게 변경(상속받은 메소드 변경)
- 선언부(메소드명, 매개변수, 리턴타입)이 모두 같아야한다.
- 접근 제어자를 좁은 범위로 변경 불가
- 부모 메소드보다 많은 수의 예외 선언 불가
7. 생성자
1) 생성자란
- 인스턴스 초기화 메소드
- 인스턴스 생성시 인스턴스 변수를 초기화한다.
- 참조변수 선언시 매개변수에 맞는 생성자로 초기화
- 기본 생성자: 생성자가 없으면 기본 생성자 자동 추가 ‘ 클래스명() {} ‘
2) 생성자 양식
- 클래스명 (매개변수) {}
- 기본 생성자를 제외하면 매개변수 필요(참조변수를 사용가능)
3) 다른 생성자 호출
- 동일 클래스 내 다른 클래스 호출시 사용
- 생성자 첫 문장에서만 가능
- 양식: this(매개변수); // 매개변수가 없으면 기본 생성자 호출
- 필수사항이며 미기재시 super를 자동 호출한다.
4) 부모와 자손의 생성자
- 자손의 생성자 첫 문장에서 부모 클래스의 생성자를 호출
8. 상속과 포함
1) 상속이란(is-a)
- 두 클래스를 부모와 자손으로 관계를 맺어줌
- 자손 클래스 선언시 ‘extends 클래스명’을 추가
- 자손 클래스는 부모 클래스의 변수 및 메소드를 상속받는다.(생성자 제외)
- 부모 클래스에서 private로 접근을 제한하는 변수 및 메소드는 상속 제외
2) 특징
- 공통 부분은 부모 클래스에서 관리
- 자손 클래스는 복수의 부모 클래스에 상속될 수 없다.
3) 포함이란(has-a)
- 한 클래스의 멤버변수로 다른 클래스 선언
9. 제어자
- 선언부에 추가되어 클래스, 변수, 메소드를 제어
- 편의와 데이터 보호를 위해 사용
1) 접근제어자
- private: 동일 클래스 내 접근 가능
- default: 동일 패키지 내 접근 가능
- protected: 동일 패키지 내, 다른 패키지의 자손 클래스 내 접근 가능
- public: 접근 제한 없음
2) static
- 클래스: 모든 인스턴스에 공통으로 사용되는 클래스 변수가 되어 인스턴스 없이 사용 가능
- 메소드: 인스턴스 없이 클래스명.메소드명으로 사용 가능
3) final
- 클래스: 변경 불가, 확장 불가 -> 부모 클래스가 될 수 없음
- 메소드: 변경불가, 오버라이딩 불가
10. 다형성
- 하나의 객체가 다양한 형태로 사용되는 것
- 주로 상속을 전제조건으로 해서 부모클래스를 참조하는 참조변수가 자손클래스의 객체를 다룰 수 있는 것을 말함
1) 객체 배열
- 부모 클래스에 선언된 배열에 자손 클래스의 값을 저장 가능
- 다형성을 이용해서 다양한 타입의 데이터를 한 배열에 저장하는 이종모음이 가능
2) 매개변수의 다형성
- 매개변수 위치에 참조변수를 사용해서 자신의 객체 혹은 자손의 객체 전달 가능
11. equals 메소드와 instanceof 메소드
1) equals 메소드
- 객체 동등 비교 메소드
- 양식: 비교문자열.equals(변수)
*주의: 변수.equals(문자열) // 반대로 입력시 변수에 null이 들어오면 에러가 발생할 수 있다.
2) instanceof 메소드
- 객체가 지정한 클래스의 인스턴스인지 검사
- 참조변수 형변환 전에 확인 용도로 사용
- 양식: 참조변수 instanceof 타입(클래스명)
*쉽게 설명하면 한 참조변수가 그 클래스를 참조하는지 확인
3) 참조변수 형변환 방법
- 자손의 인스턴스 사용 가능, 상속관계에서만 가능
*부모클래스의 참조변수 = (부모클래스명)자손클래스 참조변수
ex) Menu m = new Menu(); // 부모클래스 Menu의 참조변수 m
Americano ame = new Americano(); // 자손클래스 Americano의 참조변수 ame
m = (Menu)ame;
m = ame; // 자손 클래스 참조시 부모클래스명 생략 가능
Menu m = new Americano(); // 부모 타입의 참조변수 생성시 자손 클래스를 참조하도록 한 번에 생성도 가능
12. 추상 클래스(abstract class)
1) 추상 클래스
- 추상 메소드(미완성 메소드)를 포함하고 있는 클래스
- 추상 클래스에 상속받아 클래스 작성 방향을 제시
- 단계별로 작성해서 클래스에서 필요한 부분을 상속받아 사용 가능
2) 추상 메소드
- 선언부만 있고 구현부가 없는 메소드
- 자손클래스에서 추상메소드의 구현부를 완성해야 한다.
3) 추상 클래스의 작성
- 추상 클래스를 작성하고 여러 클래스에 공통적으로 사용
- 기존 클래스의 공통 부분을 추상클래스로 작성
13. 인터페이스(interface)
1) 인터페이스
- 추상클래스의 집합
- 실제 구현된 것이 전혀 없는 기본 설계도
2) 인터페이스 작성
- 인터페이스 생성 양식: interface 인터페이스명
- 구성요소는 추상메소드와 상수만 가능
- 모든 멤버변수는 public static final, 메소드는 public abstract (생략 가능)
3) 인터페이스 상속
- 다중상속을 허용한다.
- Object클래스와 같은 최상위 조상이 없다.
4) 인터페이스 구현
- 구현부 생성 양식: class 클래스명 implements 인터페이스명
- 인터페이스에 정의된 추상메소드를 완성해야 한다.
- 상속과 구현을 동시에 할 수 있다.
ex) class Fighter extends Unit implements Fightable {}
5) 인터페이스를 이용한 다형성
- 인터페이스를 구현한 클래스의 객체 사용 가능
- 인터페이스 타입의 참조변수로 구현 클래스의 인스턴스 참조 가능
- 인터페이스를 메소드의 매개변수 타입으로 지정할 수 있다.
6) 인터페이스의 장점
- 개발시간 단축
- 표준화 가능
- 관계없는 클래들의 관계를 맺어줌
- 독립적인 프로그래밍 가능
7) 디폴트 메소드
- 이미 구현된 클래스를 가진 인터페이스에 메소드를 추가하면 인터페이스를 구현한 모든 클래스에 메소드를 구현해야는 문제 발생
- 디폴트 메소드를 추가하면 모든 클래스에 구현할 필요가 없음
- 양식: default void 메소드명() {}
- 1.8 버전 이상에서만 사용 가능
- 디폴트 메소드 간의 충돌: 구현 클래스에서 디폴트메소드 오버라이딩
- 디폴트 메소드와 조상 클래스 메소드 간의 충돌: 조상 클래스 메소드 상속
14. 내부 클래스
- 클래스 내부에 선언된 클래스
- 특정 클래스 내에서만 주로 사용되는 클래스를 선언
- GUI어플리케이션(AWT, Swing)의 이벤트처리에 주로 사용
1) 내부 클래스의 장점
- 내부 클래스에서 외부 클래스 멤버에게 쉽게 접근
- 코드의 복잡성 저하(캡슐화)
2) 내부 클래스의 특징
- static 클래스만 static 멤버를 정의 가능
- 내부 클래스는 외부 클래스의 멤버로 간주되며 동일한 접근성을 가진다
- 내부 클래스는 외부클래스의 fianl 변수만 접근 가능
3) 내부 클래스의 사용
- 내부 클래스는 Outer 생성 후 선언 가능
ex)
Outer o = new Outer();
Outer.Inner i = o.new Inner();
- static 내부 클래스는 Outer 생성 없이 Inner 생성 가능
ex) * static class Inner {int iv=0;}
Outer.Inner i = new Outer.Inner();
System.out.println("i.iv="+i.iv);
4) 익명 클래스
- 이름이 없는 일회용 클래스
- 단 하나의 객체 생성 가능
- 양식: new 부모클래스명() {멤버선언} or new 부모인터페이스명() {멤버선언}
- 익명 클래스의 이름은 클래스$숫자로 저장된다.
'프로그래밍 > Java' 카테고리의 다른 글
[Java 요약 정리] 6. 지네릭스(Generics) (0) | 2018.12.26 |
---|---|
[Java 요약 정리] 5. 컬렉션 프레임워크(Collections Framework) (0) | 2018.12.26 |
[Java 요약 정리] 4. 날짜와 시간 (0) | 2018.12.23 |
[Java 요약 정리] 3. java.lang 패키지 (0) | 2018.12.23 |
[Java 요약 정리] 2. 예외 처리(Exception handling) (0) | 2018.12.23 |