자바 이론 및 예제 복습(객체 지향 프로그래밍(OOP) - 클래스와 객체 | 객체 배열 | 상속 | 다형성)
✅자바 이론 및 예제 복습 - Part 2. 객체 지향 프로그래밍(2022.01.31)
🚀 객체지향 프로그래밍의 3대 특성에 대해 이해할 수 있다: 캡상추다
클래스와 객체CLASS AND OBJECT
📚 이론
[JAVA] 6-2. 객체 지향 언어, 캡슐화, 추상화, 생성자
[JAVA] 6-3. 오버로딩, 파라미터, static, final, 싱글톤 패턴
[JAVA] 6-4. 클래스변수, 인스턴스변수, 지역변수, 초기화 순서
📚 학습점검
🚀 객체에 대해 이해하고 클래스 작성 문법을 숙지하여 클래스를 작성하고 객체를 생성할 수 있다.
-- USER TYPE
✅ 사용자 정의의 자료형을 이해할 수 있다.
▶변수는 하나의 값만을 저장할 수 있는 공간이고, 배열은 같은 자료형만을 묶을 수 있다는 한계가 있다. 이 같은 점을 보완할 수 있는 것이 바로 사용자 정의 클래스이다.
✅ 클래스와 인스턴스의 차이를 이해하고 설명할 수 있다.
▶클래스는 객체를 추상화한 공간으로 회원을 가리킨다. 인스턴스는 그 회원의 이름, 나이 등등 객체를 말한다.
▶클래스를 인스턴스화 시키면 인스턴스가 된다.
✅ 사용자 정의의 자료형을 작성하고 활용할 수 있다.
▶멤버변수, 기본생성자/매개변수 있는 생성자, 설정자(setter)와 접근자(getter)로 구성된다. Member member = new Member(); 자료형 참조변수명 = 연산자 생성자(); 형식으로 호출된다.
-- ENCAPSULATION
✅ 캡슐화를 적용하지 않는 경우 문제점이 무엇인지 이해할 수 있다.
▶캡슐화란 다른 말로 데이터 은닉을 말한다. 필드에 직접 접근을 허용했을 때는 유효하지 못한 값이 자리에 오더라도 이를 제한할 수 없었다.
▶캡슐화 없이는 코드 결합도가 높다. 필드명을 바꾸거나 하면 해당 내용이 쓰인 모든 코드에 변경사항이 생긴다.
✅ 접근 제한자에 대해 이해할 수 있다.
▶public(+) > protected(#) > default(~) > private(-)이 있다. private은 같은 클래스 내에서 한정적으로 사용할 수 있고, default는 키워드가 생략된 경우를 지칭하며 같은 클래스와 같은 패키지 내까지를 허용한다. protected는 같은 클래스 내, 같은 패키지 내, 후손 클래스 내까지 이어진다. public은 말처럼 전체 영역에서 소환할 수 있다.
✅ 캡슐화의 목적을 설명할 수 있다.
▶필드로의 직접 접근을 제한하고, public 메소드 통해 이용하도록 한다. 외부적으로 드러내지 않아도 될 부분에 대해 은닉할 수 있고, 나아가 정해진 범위에 대해서만 초기화할 것을 강제(간접 접근 강제)한다. 또한 코드간 결합도를 낮추는 효과까지 기대할 수 있다.
✅ 캡슐화를 적용하여 클래스를 작성할 수 있다.
-- ABSTRACTION
✅ 추상화를 이해하고 설명할 수 있다.
▶트럭, 택시, 스포츠카 등등 객체가 가진 각각의 속성과 기능에서 공통된 개념만을 추출한 것이다.
▶코드의 유연성, 재사용성, 유지보수성을 높인다.
✅ 객체를 추상화하여 클래스를 작성하고 이를 활용할 수 있다.
-- CONSTRUCTOR
✅ 생성자에 대해 이해할 수 있다.
▶기본 생성자와 매개변수 있는 생성자로 나뉜다.
✅ 생성자의 사용 목적에 대해 이해할 수 있다.
▶생성자는 필드 초기화 작업을 수행한다.
✅ 생성자의 작성 문법을 숙지하여 생성자를 작성할 수 있다.
✅ 기본생성자와 매개변수 있는 생성자에 대해 이해할 수 있다.
▶기본 생성자는 기타 생성자가 없을 시에만 컴파일러에 의해 자동 추가된다. 따라서 기본 생성자 우선 작성 후, 매개변수 있는 생성자를 작성해가는 것이 좋다.
✅ this.과 this()를 이해할 수 있다.
▶각각 참조변수 또는 생성자라는 개념부터 다르다. this.으로 가리키는 것은 같은 클래스 내 전역변수이다. this() 생성자는 매개변수 있는 생성자 작성 시에 이미 초기화된 다른 생성자 값들을 불러올 때 쓰인다.
✅ 복사 생성자에 대해 이해할 수 있다.
▶깊은복사의 일례이다. 다른 생성자에서 이미 초기화된 필드값들을 this(A, B, C); 형태로 불러와 새로운 인스턴스에 쓸 수 있다.
-- OVERLOADING
✅ 오버로딩이 무엇인지 설명할 수 있다.
▶같은 이름을 가진 메소드 선언부의 매개변수 타입, 개수, 순서가 다르면 별개의 메소드 정의로 본다.
✅ 오버로딩의 사용 이유에 대해 이해할 수 있다.
✅ 오버로딩의 성립 요건에 대해 설명할 수 있다.
▶접근제한자나 반환형은 성립 요건 대상이 아니다. 따라서 그것들과는 관계 없이 매개변수의 타입, 개수, 순서만 다르면 별도의 메소드로 인식된다.
-- PARAMETER
✅ 다양한 타입의 매개변수를 활용하여 메소드를 작성하고 호출할 수 있다.
▶매개변수로 int, int[], Square, Square[], String... 모두 받을 수 있다. 기본자료형, 기본자료형 배열, 클래스자료형, 클래스자료형 배열, 가변인자가 올 수 있는 것이다.
-- STATIC
✅ static 키워드에 대해 이해할 수 있다.
▶static 키워드와 함께 쓰인 멤버는 프로그램 시작 시부터 종료 시까지 이어지며, 정적 메모리 영역에 배정된다.
▶static 멤버는 여러 인스턴스가 공유할 목적으로 쓰인다.
✅ static member와 non static member를 구분하여 접근할 수 있다.
▶non static은 참조변수명.필드명으로 호출된다. static의 경우는 클래스명.필드명으로 쓰인다.
▶static 멤버 안에서는 this. 같은 참조변수 사용 불가하다. 객체의 주소값을 가리키는 참조변수 특성상 인스턴스 생성 이후에 사용이 가능하기 때문이다. static은 그 이전에 할당된다.
-- FINAL
✅ 필드에서 사용하는 final의 의미를 이해할 수 있다.
▶최종적인 그 의미처럼 한 번 초기화되면 값을 변경할 수 없다.
▶static final은 상수 필드를 말한다.
-- SINGLETON
✅ 싱글톤 패턴에 대해 이해할 수 있다.
▶하나의 인스턴스를 만들어 공유하는 디자인 패턴이다.
✅ 싱글톤 패턴의 장단점에 대해 이해할 수 있다.
▶인스턴스가 절대적으로 하나임이 보장된다. 처음 인스턴스 생성 시에는 시간이 소요되지만, 두 번째부터는 별도 생성을 필요로 하지 않는다.
▶동시성에 있어 고려할 사항이 생긴다. 데이터간 결합도가 높아질 수 있다.
✅ 이른 초기화와 게으른 초기화를 구분하여 싱글톤 패턴을 구현할 수 있다.
▶클래스가 초기화되는 시점에 인스턴스를 생성하거나(eager), 클래스가 초기화되는 시점에는 null로 두었다가 getInstance() 메소드에서 if문 사용해 인스턴스를 생성하는 방법이다(lazy).
-- KINDS OF VARIABLE
✅ 변수의 작성 위치 및 static 키워드 유무에 따른 구분을 할 수 있다.
✅ 변수 종류별 특징과 라이프사이클, scope에 대해 이해할 수 있다.
▶전역변수/지역변수로 크게 나눠볼 수 있다. 전역변수는 다시 클래스변수(staitc변수)와 인스턴스변수로 나뉜다. 지역변수는 선언된 메소드 블럭 {} 안에서만 유효하며, 메소드 선언부에 쓰인 매개변수 역시 지역변수라 할 수 있다.
-- INIT BLOCK
✅ 초기화 블록에 대해 이해할 수 있다.
✅ 필드의 초기화 순서에 대해 이해할 수 있다.
▶JVM 기본값, 명시적 초기화, 정적 초기화 블럭, 인스턴스 초기화 블럭, 생성자로 이어진다. 최종적으로 쓰이는 것은 생성자를 통한 초기화 방법이다.
객체 배열OBJECT ARRAY
📚 이론
▶DTO 사용 예시를 배웠다.
📚 학습점검
🚀 객체 배열의 사용 목적과 구조를 이해하여 객체 배열을 생성하고 개발에 활용할 수 있다.
-- INIT
✅ 객체 배열의 사용 목적을 이해할 수 있다.
▶Member member = new Member();라는 객체가 있을 때 결국 가리키는 것은 멤버 한 명뿐이다. 이 같은 한계를 넘어 같은 타입의 인스턴스 여럿을 배열로 다루기 위한 것이 객체 배열이다. Member[] members = new Member[100];처럼 고쳐쓸 수 있다.
✅ 객체 배열의 구조를 이해할 수 있다.
▶Member[] members; 선언만 진행한 경우이다.
✅ 객체 배열을 선언 및 할당하여 객체를 저장할 수 있다.
▶Member[] members = new Member[100];처럼 선인 및 할당할 수 있다.
✅ 객체 배열을 선언과 동시에 초기화 하여 사용할 수 있다.
▶Member[] members = {new Member(A, B), new Member(A, B)}; 처럼 블럭 안에 작성해 선언과 동시에 초기화도 가능하다.
✅ 객체 배열 연속 처리 시 반복문을 활용할 수 있다.
▶index를 이용한 객체이기에 일반 for문과 향상된 for문 모두 사용 가능하다.
-- USES
✅ 객체 배열을 인자나 리턴값으로 사용할 수 있다.
▶public void apply(Member[] members)처럼 인자로 쓰일 수 있다. return new Member[] {new Member(), new Member()};처럼 리턴값으로 명시할 수도 있다.
상속INHERITANCE
📚 이론
📚 학습점검
🚀 상속의 개념과 목적, 장단점에 대해 이해하고 부모 클래스를 상속받아 새로운 클래스를 작성할 수 있다.
-- EXTENDS
✅ 클래스 상속에 대한 개념을 설명할 수 있다.
▶조상클래스, 자손클래스 개념이 등장한다. extends 선언하는 순간 조상클래스의 멤버를 모두 상속 받는 것이다. 멤버 외에 타입 또한 상속 받는다 할 수 있는데, 이 개념은 다형성에 해당한다.
✅ 상속의 목적을 설명할 수 있다.
▶클래스간 재사용성을 높인다.
✅ 상속의 장단점을 설명할 수 있다.
▶같은 내용을 추가적으로 작성할 필요 없이 상속 받아 재정의해 사용할 수 있다. 자손클래스에서는 부모클래스로부터 상속 받은 멤버 외에 자신만의 멤버를 만들어 쓸 수 있다. 영단어 그대로 확장(extend)이라는 의미로도 통하는 것이다.
▶상속 관계가 생겨나고 나면, 부모클래스의 멤버를 수정/삭제할 때 자식클래스에게 미칠 영향까지 따져볼 수밖에 없다. 자손클래스가 재정의해 쓰고 있는 내용이라면 부모클래스로부터 함부로 삭제할 수 없기 때문이다. 반대로 자손클래스에게는 필요치 않은 내용까지 모두 상속 받는 것이어서 사용 중 다른 문제를 야기할 수도 있다.
✅ IS-A관계를 고려하여 상속이 필요한 경우를 구분할 수 있다.
▶단, 자신에게 맞게 재정의하는 작업이 모든 멤버에 대해 치러진다면 결국 새 클래스를 작성한 것과 다름이 없다. 따라서 필요 시에만 상속 관계를 가질 수 있도록 해야 하는데, 이때 따져볼 것이 바로 IS-A 관계이다. Circle Is A Shape와 같은 예시가 있다.
-- SUPER. AND SUPER()
✅ super.과 super()를 이해할 수 있다.
▶각각 참조변수와 생성자이다. 이들은 조상클래스의 멤버를 가리킨다. 자식클래스의 기본생성자 실행 시에 부모클래스가 먼저 실행된다. 컴파일러가 super();를 자동으로 추가해주기 때문이다.
-- OVERRIDING
✅ 오버라이딩에 대해 설명할 수 있다.
✅ 오버라이딩 성립 요건에 대해 설명할 수 있다.
▶자손클래스가 부모클래스로부터 상속 받은 메소드를 저에게 맞게 재정의하는 것을 말한다. @Override 어노테이션을 명시해 실현 가능한 오버라이딩 요건인지 확인할 수 있다.
✅ 오버로딩과 오버라이딩을 구분하여 각각의 개념과 공통점, 차이점을 설명할 수 있다.
▶둘은 전혀 관계가 없는 개념인데 이름 때문에 종종 차이를 묻고는 한다. 오버로딩은 이름이 같은 메소드를 매개변수의 타입, 개수, 순서를 다르게 하여 쓰는 것이다. 접근제한자나 반환형은 달라도 상관 없다. 반면, 오버라이딩은 상속 관계에서 발생한다. 자손클래스가 부모클래스로부터 물려 받은 메소드를 저에게 맞게 재정의하는 것을 일컫는다. 이때 메소드명, 매개변수 타입-개수-순서, 반환형까지 같아야 한다. 접근제한자는 부모클래스와 같거나 더 넓은 범위로 확장만 가능하다.
다형성POLYMORPHISM
📚 이론
📚 학습점검
🚀 다형성의 개념과 장단점에 대해 이해하고 다형성을 적용하여 개발에 활용할 수 있다.
-- POLYMORPHISM
✅ 다형성의 개념에 대해 설명할 수 있다.
▶상속에서 비롯된 개념으로 '타입의 상속'을 일컫는다. 부모 타입으로 자식 인스턴스를 받을 수 있는 것이다. 즉 하나의 인스턴스를 여러 타입으로 작성할 수 있다.
✅ 다형성의 장단점을 설명할 수 있다.
▶각각의 인스턴스로 생성했어야 할 것들을 부모 타입 하나로 관리할 수 있다는 이점이 따른다. 상속 관계에 있는 모든 객체로 하여금 동일한 메소드를 정의하도록 만들 수 있다. 다형성은 확장성이 좋은 코드이자 유지보수성이 높은 코드를 만든다.
✅ 동적 바인딩에 대해 설명할 수 있다.
▶컴파일 시 가리키는 것은 부모클래스의 메소드이나, 실제 런타임 때는 참조하고 있는 자식클래스의 메소드를 실행한다. 동적바인딩이 성립되기 위해서는 상속 관계에 있고, 다형성이 성립되었으며, 오버라이딩 되었을 때여야 한다.
✅ 타입 형변환에 대해 이해할 수 있다.
▶부모 타입으로 자식 인스턴스를 가리키고 있을 땐 부모 타입에 있는 멤버만 호출할 수 있다. 따라서 자식클래스에 선언된 멤버를 사용하기 위해서는 다운캐스팅이 필요하다. 상위 타입으로 형변환하는 업캐스팅은 묵시적, 명시적 사용 모두 가능하고, 다운캐스팅의 경우는 반드시 명시해야만 한다. ((Rabbit)a).jump(); 처럼 참조연산자 바로 앞까지 소괄호가 쓰인다.
✅ instanceof 연산자의 사용 목적을 이해하고 활용할 수 있다.
▶형변환 과정에서 ClassCastException 발생 가능성이 있다. 이에 따라 형변환 전에 인스턴스가 실제 가리키고 있는 자식 타입이 무엇인지 확인하고 실행에 옮겨야 한다. 보통 if문 조건식으로 담는다. if(a instanceof Apple) {};
✅ 객체 배열에 다형성을 적용하여 사용할 수 있다.
▶Parent[] p = new Child[] {new Child1(), new Child2(), new Child(3)};
✅ 매개변수에 다형성을 적용하여 사용할 수 있다.
▶public void run(Animal a) {}; 메소드 선언부의 매개변수로 부모 타입을 작성해 쓸 수 있다. 이때 자식 인스턴스가 추가된다해도 메소드 시그니처는 변경사항 없이 계속 쓸 수 있는 것이다.
✅ 리턴 타입에 다형성을 적용하여 사용할 수 있다.
▶return num == 0 ? new Child1() : new Child2();
-- ABSTRACT CLASS
✅ 추상클래스와 추상메소드에 대해 설명할 수 있다.
▶미완성 클래스이기에 객체 생성이 불가하다. 그 특성상 해당 클래스로 객체가 생성되지 않았으면 할 때에 의도적으로 추상클래스 선언도 가능하다. 추상메소드는 구현부 없이 선언되는 메소드로, 상속 받는 클래스에서 반드시 구현하도록 되어 있다.
✅ 추상클래스의 문법적 특징에 대해 설명할 수 있다.
▶abstract 키워드로 나타낼 수 있다. 필드, 생성자, 일반 메소드 모두 쓰일 수 있기에 추상메소드에 대해서는 abstract 키워드가 반드시 명시되어야 한다.
✅ 추상클래스의 사용 목적에 대해 설명할 수 있다.
▶여러 클래스가 가져야 할 필수적이고 일관적인 가이드라인을 잡아둘 때 쓰일 수 있다. 즉 오버라이딩 강제화를 위해 쓴다.
-- INTERFACE
✅ 인터페이스에 대해 설명할 수 있다.
✅ 인터페이스의 문법적 특징에 대해 설명할 수 있다.
▶일반적으로 추상메소드와 상수 필드만을 취급한다. 1.8 이상부터 static메소드와 default메소드를 취급할 순 있다. 인터페이스에서 쓰이는 메소드는 어차피 추상메소드이므로 public abstract 키워드 생략 가능하다. 상수 필드도 마찬가지로 public static final 키워드 생략 가능하다.
✅ 인터페이스의 사용 목적에 대해 설명할 수 있다.
▶자바의 단일상속 한계를 개선한 것이 인터페이스이다. 반드시 구현되어야 할 기능들에 대해 가이드라인을 잡아둘 수 있다. 즉 오버라이딩 강제화, 기능의 표준화를 가능케 한다.
✅ 인터페이스와 추상클래스를 각각 설명하고 공통점과 차이점에 대해 설명할 수 있다.
▶추상클래스는 단일상속/extends키워드 사용/추상메소드가 0개 이상/생성자 또는 인스턴스 생성 못함/참조형으로 사용
▶인터페이스는 다중상속/implements키워드 사용(상속 시엔 extends)/모든 메소드가 추상메소드이자 1개 이상/생성자 또는 인스턴스 생성 못함/참조형으로 사용
'Java' 카테고리의 다른 글
[JAVA/수업 과제 practice] 2차 필기 테스트 (0) | 2022.02.02 |
---|---|
[JAVA/수업 과제 practice] 1차 필기 테스트 (0) | 2022.02.02 |
[JAVA/2nd Review] Part 1. 기초 문법 (0) | 2022.01.31 |
[자바의 정석] Ch 9. API 예제 응용 학습 (0) | 2022.01.23 |
[자바의 정석] Ch 8. 예외처리 예제 응용 학습 (0) | 2022.01.22 |