본문 바로가기

프로그래밍/Java

[Java 요약 정리] 1. 객체지향 프로그래밍(OOP)

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 부모인터페이스명() {멤버선언}

- 익명 클래스의 이름은 클래스$숫자로 저장된다.