오늘을 마지막으로 객체지향프로그래밍의 수업이 끝난다. 워낙 어렵고 이후에 스프링 등을 배울때 자주 쓰이는 부분이라 하시니 총 정리를 하면서 스스로 개념정리를 해야할것같아 오늘 풀로 주어진 블로김 및 심화실습시간을 이용하려고한다.
뿐만 아니라 심화실습을 하며 어려웠던 부분도 정리할것이다!
이러다 보니 아무래도 내용이 많이 길어지겠지만 뿌셔보자!!
객체지향 프로그래밍 생긴 이유?
객체지향 프로그래밍은 절차지향적 프로그래밍이다.
객체지향 프로그래밍 장점?
클래스(Class) : 객체지향프로그래밍에서의 클래스는 객체의 설계도 혹은 설계도의 틀 과 같다.
클래스 정의에 기반하여 객체를 생성하기 때문.
객체는 클래스에 정의되고 설계된 내용 그대로 생성.
붕어빵과 붕어빵기계와도 자주 비교한다.
위 그림을 보면 클래스인 자동차설계도를 통해 객체인 자동차들이 생성됐다.
클래스를 통해 생성된 객체를 클래스의 인스턴스라고 한다.
클래스를 통해 객체를 생성하는 과정을 인스턴스화라고 한다.
혼돈주의❗ 객체와 인스턴스의 차이?
객체와 인스턴스는 거의 같은 의미이지만 굳이 구분한다면 객체 안에 인스턴스가 포함된다고 보면 된다.
객체는 모든 인스턴스를 포괄하고, 인스턴스는 해당 객체가 어떤 클래스로부터 만들어진것인지 강조한다.
클래스 정의가 중요한 이유?
위의 Car 그림을 코드로 나타내면 이와 같다.
- 클래스는 4개의 요소로 구성되어있는데 각각 필드(Field), 메서드(Method), 생성자(Constructor), 이너클래스(Inner class)라고 한다.
객체의 속성(state)를 정의한다.
필드에는 각각 클래스 변수, 인스턴스 변수, 지역 변수가 존재한다.
변수마다 선언된 영역에 따라 이름이 바뀌고, static유무에 따라 바뀐다.
class Example { // 클래스 영역
int instanceVariable; // 인스턴스 변수
static int classVariable; // 클래스 변수
void method() { //메서드 영역
int localVariable = 0; // 지역변수. 메서드{} 안에서만 유효.
}
}
클래스는 클래스 영역에 저장.
참조변수는 스택 메모리 영역에 저장.
new 생성자는 힙 메모리 영역에 저장.
객체의 기능(behavior)을 정의한다.
특정 작업을 수행하는 실행문들의 집합이다.
메서드 시그니처(signature)와 메서드 바디(body)로 구분된다.
public static int add(int x, int y) { // 메서드 시그니처
int result = x + y; // 메서드 바디
return result;
}
메서드 오버로딩 : 하나의 클래스 안에 중복되는 이름의 메서드들을 정의하는것.
메서드 오버로딩 조건
인스턴스 생성 시 호출되는 인스턴스 변수 초기화 메서드
new
가 인스턴스 생성을 하며 참조변수에 주소값을 저장하고, 생성자는 new
로 생성된 인스턴스 변수를 초기화한다.
오버로딩 가능.
생성자와 메서드의 차이
this() : 자신이 속한 클래스에서 다른 생성자 호출
this : 인스턴수 변수와 매개변수 구분. this.
가 붙은 변수는 인스턴스 자신의 변수를 가리킴.
이너클래스는 내부클래스와 같은 말.
이너클래스 : 클래스 내에 선언된 클래스.
내부 클래스를 통해 외부 클래스의 멤버에 쉽게 접근 가능.
캡슐화 달성에 유용.
내부클래스는 3가지가 있음.
인스턴스 내부 클래스
정적 내부 클래스
지역 내부 클래스
익명 내부 클래스
new
메서드를 사용하여 새로운 인스턴스를 만들었다.상속 : 자바에서의 상속은 기존 클래스를 재사용하여 새로운 클래스를 작성하는 자바의 문법요소이다.
상위(부모)클래스 - 하위(자식)클래스 로 이뤄진다.
하위클래스는 상위클래스의 모든 멤버를 상속받는다.(확장되는게 더 잘맞다고 본다.)
extends
키워드를 통해 상속할수있다.
다른 언어에서는 다중상속이 가능하지만, 자바에서는 단일 상속만이 가능하다.
상속의 장점
포함(composite) : 클래스의 멤버로 다른 클래스 타입의 참조변수 선언.
상속과 포함관계 헷갈릴 가능성多
메서드오버라이딩 : 상위클래스로부터 상속받은 메서드와 동일한 이름의 메서드를 재정의하는것
❗❗메서드 오버로딩과 메서드 오버라이딩의 차이❗❗
메서드 오버로딩은 같은 이름의 메서드를 새로 만드는것.
public class OverloadingTest{
public static void main(String[] args) {
OverloadingMethods olMethods = new OverloadingMethods();
olMethods.print();
olMethods.print(1);
olMethods.print(2,3);
olMethods.print(4.0);
}
}
class OverloadingMethods {
public void print() {
System.out.println("난 오버로딩");
System.out.println("-".repeat(15));
}
public void print(int a) {
System.out.println("이 몸이 오버로딩이시다!");
System.out.println(a);
System.out.println("-".repeat(15));
}
public void print(int b, int c) {
System.out.println("꿇어라. 이것이 오버로딩이다.");
System.out.println(b +","+ c);
System.out.println("-".repeat(15));
}
public void print(double d) {
System.out.println("오버로딩은 이렇답니당");
System.out.println(d);
System.out.println("-".repeat(15));
}
}
출력결과
난 오버로딩
---------------
이 몸이 오버로딩이시다!
1
---------------
꿇어라. 이것이 오버로딩이다.
2,3
---------------
오버로딩은 이렇답니당
4.0
---------------
메서드 오버라이딩은 상위클래스의 기존 메소드를 하위클래스에서 재정의 하는것.
public class OverridingTest {
int age;
String name;
Address address;
public OverridingTest(int age, String name, Address address){
this.age = age;
this.name = name;
this.address = address;
}
void showInfo() {
System.out.println("저는 " + name + "이고 나이는 " + age + "살 입니다.");
System.out.println("나라는 " + address.country + "이고, 지역은 " + address.city + "입니다.");
}
public static void main(String[] args){
Address address1 = new Address("한국", "서울");
Address address2 = new Address("미국", "워싱턴 D.C");
OverridingTest dotdot = new OverridingTest(20 , "김땡땡", address1);
OverridingTest nana = new OverridingTest(30, "박나나", address2);
dotdot.showInfo();
System.out.println("-".repeat(15));
nana.showInfo();
}
}
class Address {
String city, country;
public Address(String country, String city) {
this.city = city;
this.country = country;
}
}
출력결과
저는 김땡땡이고 나이는 20살 입니다.
나라는 한국이고, 지역은 서울입니다.
---------------
저는 박나나이고 나이는 30살 입니다.
나라는 미국이고, 지역은 워싱턴 D.C입니다.
메서드 오버라이딩 조건
super : 상위 클래스의 객체
super() : 상위 클래스의 생성자 호출
참조변수의 타입 변환 : 사용할 수 있는 멤버의 개수를 조절하는 것.
타입변환 조건
추상클래스 : 메서드시그니처만 존재하고 바디가 선언되지 않은 추상메서드를 포함하는 미완성 설계도
반드시 추상메서드가 한개이상 있어야함.
abstract키워드 사용.
추상클래스는 상속관계에 있어 새로운 클래스를 작성하는데 매우유용
추상클래스 장점?
상속계층도의 상층부에 위치할수록 추상화정도가 높고, 내려갈수록 구체화된다.
위 그림은 예로, Provider클래스에 의존하는 User클래스가 있다고 가정.
만약 Provider 클래스를 Provider2,3.....로 변경할경우 변경할때마다 User 클래스 변경해야함.
이 경우 인터페이스가 Provider클래스를 감싸고 User클래스를 연결시켜두면 User을 매번 변경할 필요 없음.
이와같이 인터페이스는 역할과 구현을 분리시켜줌.
이렇게 오늘 하루종일 객체지향프로그래밍을 정리했다.
물론 뿐만아니라 심화실습 문제들도 풀었지만 시간이 너무 오래걸릴것같아 내일 작성하려고 한다.