객체 지향 프로그래밍이란?
객체지향 언어
- 코드의 재사용성이 높다. (상속)
- 코드의 관리가 용이하다.
- 신뢰성이 높은 프로그래밍을 가능하게 한다.
특징 : 캡슐화 , 상속 , 다형성
-캡슐화 : 객체의 필드, 메서드를 하나로 묶고, 실제 구현 내용을 감추는 것.
예를 들어 getter, setter / setter를 만들지 않고 생성자에 인자 값이 있는 생성자를 만들어서 사용.
접근 제한자를 사용하여 캡슐화된 멤버를 노출할지, 숨길지를 결정할 수 있다.
- 상속 : 부모가 자식에서 자신(부모)가 가진 필드와 메서드를 하위 객체(자식)에게 물려주어 하위 객체가
사용 할 수 있도록 해준다.
- 다형성 : 하나의 타입에 여러 객체를 대입함으로써 다양한 기능을 이용할 수 있도록 해준다.
객체란?
: 세상에 존재하는 모든 것, 프로그래밍에서 속성과 기능을 가지는 프로그램 단위
객체 | |||
인간세계 | 프로그램 | ||
자전거 속성: 바퀴, 체인 기능: 이동수단 |
TV 속성 : 채널, 사운드 기능 : 미디어 방출 |
날씨 프로그램 속성 : 온도, 미세먼지 기능 : 날씨예보 |
사칙연산 프로그램 속성 : +, -, *, / 기능 : 사칙연산 |
객체와 인스턴스
: 클래스로부터 객체를 만드는 과정을 클래스의 인스턴스화라고 한다.
클래스 참조 변수명 = new 생성자();
인스턴스 생성시 default생성자가 바로 호출된다.
디폴트 생성자가 없을 시 컴파일러시 자동생성된다.
Calss class = new Class();
* 인스턴스와 객체는 같은 의미이므로 두 용어의 사용을 엄격히 구분할 필요는 없지만, 문맥에 따라 구별하여
사용하는 것이 좋다.
* 메모리(heap) 영역에 생성된다.
* 객체가 더 이상 필요 없게 되면 GC(Gabage Collector)에 의해서 제거된다.
* Reference 객체 (주소값을 갖는 객체)
* 객체도 배열로 다룰 수 있다.
위 에러가 발생하는 원인은 무엇일까?
이유는 간단하다. 객체 배열만 생성해 놓고 객체를 생성했다고 착각하기 때문..
mouse[0] = new Mouse(); 객체를 생성해주면 된다.
* 소멸자 finalize();
변수
: 변수의 선언 위치에 따라서 나뉜다.
인스턴스 변수 : 인스턴스를 생성할 때 만들어진다.
클래스 변수 : 공통적인 값을 유지해야하는 속성의 경우 static 을 붙여준다.
지역 변수 : 메서드 내에 선언되어 메서드 내에서만 사용가능.
블럭에서 벗어나면 소멸.
* 인스턴스 변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만,
클래스 변수는 모든 인스턴스가 하나의 저장곤간을 공유하므로, 항상 공동된 값을 갖는다.
클래스란?
: 객체를 정의해 놓은 것, 객체의 설계도 또는 틀 이라고 정의할 수 있다.
클래스 |
객체 |
붕어빵 기계 | 붕어빵 |
제품 설계도 | 제품 |
클래스의 구성요소
: 속성(멤버변수)와 기능(메서드)로 구성된다.
메서드란?
: 특정 작업을 수행하는 일련의 문장들을 하나로 묶은 것. 수학의 함수와 유사.
선언부와, 구현부로 이루어져 있다.
호출스택 :
- 메서드가 호출되면 수행에 필요한 만큼 메모리를 할당 받는다.
- 메서드가 수행을 마치고나면 메모리를 반환하고 스택에서 제거.
- 호출스택의 제일 위에 있는 메서드가 현재 실행 중인 메서드.
- 아래에 있는 메서드가 바로 위의 메서드를 호출한 메서드.
생성자
생성자에서 다른 생성자를 호출 할 수 있다.
- 생성자 이름 대신 this 를 사용한다.
- 생성자를 호출할 때는 반드시 첫 줄에서만 호출 가능.
유기적으로 연결해주면 더 좋은 코드를 얻을 수있다.
상속
관계 결정
상속관계 '~은 ~이다.(is -a)' extend parent
스포츠카 는 차 이다.
포함관계 '~은 ~을 가지고 있다.(has -a)' parent p = new parent();
원 은 점을 가지고 있다.
단일 상속
자바는 단일 상속만을 허용한다.
클래스 간의 곤계가 보다 명확해지고 코드를 더욱 신뢰할 수있게 만들어 준다.
상속의 최상위 조상은 Object 클래스이다.
오버라이딩
: 상속받은 메서드의 내용을 변경하는 것.
오버로딩 vs 오버라이딩 !!중요
오버로딩은 기존에 없는 새로운 메서드를 추가하는것. (생성)
오버라이딩은 조상으로부터 상속받은 메서드의 내용(구현부)을 변경하는것. (변경)
참조변수 super
: 자손(자식) 클래스에서 조상(부모) 클래스로부터 상속받은 맴버를 참조하는데 사용하는 참조변수.
super.x = 10;
this.x = 20;
제어자
: 클래스, 변수 또는 메서드의 선언부에 함께 사용되어 부가적인 의미를 부여.
접근 제어자 / 그 외 제어자 로 나뉜다.
접근 제어자
: 멤버변수 또는 클래스를 외부에서 접근하지 못하도록(내부에 선언된 데이터를 보호하기 위해서) 제한하는 역할.
* 캡슐화에 해당한다.
사용될 수 있는곳 - 클래스, 멤버변수, 메서드, 생성자
그 외 제어자
: static / final / abstract
static
멤버변수 : 모든 인스턴스에 공통으로 사용되는 클래스 변수.
클래스 변수는 인스턴스를 생성하지 않고도 사용가능.
클래스가 메모리에 로드될 때 생성됨.
메서드 : 인스턴스를 생성하지 않고도 호출이 가능.
스태틱메서드 내에서는 인스턴스멤버들을 직접 사용할 수 없다. ( 로딩시점 달라서)
final
클래스 : 변경x , 확장x 그래서 다른 클래스의 조상이 될 수 없다.
메서드 : 오버라이딩을 통해 재정의 될 수 없다.
멤버변수, 지역변수 : 상수가 된다.
abstract
클래스 : 추상 메서드가 선언되어 있음을 의미.
메서드 : 추상 메서드임을 알린다.
다형성
: '여러가지 형태를 가질 수 있는 능력'
한 타입의 참조변수로 여러 타입의 객체를 참조할 수 있도록 한다.
부모클래스 변수 = new 자식클래스의 인스턴스
자식클래스 변수 = new 부모클래스 -> 에러발생!!
자식클래스에서 사용할 수 있는 변수가 부모클래스의 변수보다 많기 때문에 불가능하다.
참조변수의 형변환
: 자식타입의 참조변수를 부모타입의 참조변수로, 부모타입의 참조변수를 자식타입의 참조변수로 형변환
instanceof 연산자
: 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 사용한다.
만약 11번 줄에 car = fier 이 추가된다면 car가 참조하고 있는 인스턴스의 실제 타입이 Fire 를 가르키기 때문에
true 가 되면서 16번째 코드는 정상적으로 실행된다. 또한, 8번 코드가 Car car = new Fier() 수정되어도 true가
반환 될 것이다.
추상 클래스
: 미완성 클래스. // 미완성 메서드를 포함하고 있는 클래스.
미완성 설계도로 완성도니 제품을 만들 수 없듯이 추상클래스로 인스턴스는 생성 할 수 없다.
조상 클래스로서 중요한 의미를 갖는다.
클래스 선언부에 abstract 만 붙여주면 된다.
추상 메서드
: 선언부만 작성하고 구현부는 작성하지 않은 채 남겨둔 메서드.
부모타입의 참조변수로 자식타입의 객체를 참조하는것이 가능하므로 공통의 부모를 가진 서로 다른 종류의
객체를 배열로 묶어서 사용할 수 있다.
위 사진처럼 클래스간의 공통 부모가 없었다면 이처럼 하나의 배열로 다룰 수 없었을 것이다.
모든 클래스의 부모인 Object클래스 타입으로 배열을 만들 수 있지만 Object 클래스에는 move 메서드가
정의되어 있지 않기 때문에 호출하는 부분에서 에러가 발생 할 것이다.
인터페이스
: 일종의 추상클래스이다.
구현된 것이 아무 것도 없고 밑그림만 그려져 있는 기본설계도.
-모든 멤버변수는 public static final 이어야 하며, 이를 생략할 수 있다.
-모든 메서드는 public abstract 이어야 하며, 이를 생략할 수있다.
단, static메서드와 디폴트 메서드는 예외(JDK1.8부터)
인터페이스는 인터페이스로부터만 상속받을 수 있으며, 클래스와는 달리 다중상속, 즉 여러개의
인터페이스로부터 상속을 받는 것이 가능하다.
인터페이스의 장점
- 개발시간 단축.
- 표준화 가능.
- 서로 관계없는 클래스들에게 관계를 맺어준다. (상속관계)
- 독립적인 프로그래밍 가능.
디폴트메서드
: 추상 메서드의 기본적인 구현을 제공하는 메서드로, 추상 메서드가 아니기 때문에 디폴트 메서드가
새로 추가되어도 해당 인터페이스를 구현한 클래스를 변경하지 않아도 된다.
메서드 앞에 default 를 붙이며, 추상 메서드와 달리 몸통 { 구현부 } 이 있어야 한다.
자식클래스에 새로운 메서드를 추가하는 것과 동일한 효과.
static메서드
: jdk 1.8 부터 static 메서드 가능. 독립적인 메서드이기 때문에 추가하지 못할 이유는 없었지만 인터페이스의
규칙 때문에 예외를 두지 않았다.
내부 클래스
: 클래스 내에 선언된 클래스.
두 클래스가 서로 긴밀한 관계에 있기 때문에 내부클래스 선언.
장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
- 코드의 복잡성을 줄일 수 있다. ( 캡슐화 )
종류
: 인스턴스 클래스 / 스태틱 클래스 / 지역 클래스 / 익명 클래스