기간 : 220926~220929

220926 Java 심화 / OOP 이론

어느덧 3주차에 접어들었다. 뭔가 하루가 정말 빨리빨리 지나가는 기분이다.
공부하다보면 생각보다 많이 안한거같은데 시간이 훅훅지나간다 🥲

정리 ✏️

배열

  • 변수는 한 개의 데이터만 저장 가능
  • 동일한 데이터 타입을 여러 개 저장하고 싶을 때 배열을 사용한다.
  • 배열의 순서(인덱스)는 0부터 시작
  • 물리적 위치 == 논리적 위치
  • 하나의 배열 이름을 공유하기 때문에 for문을 통해 사용 ( for-each문 사용 가능)
데이터타입[] 배열변수명 = new 데이터타입[데이터갯수];
int[] scores1 = new int[100]; // 저장할 원소 갯수만 알고 있는 경우

데이터타입[] 배열변수명 = {...};
int[] scores2 = {90, 80, 72, ..., 60} // 원소값을 알고 있는 경우

데이터타입[] 배열변수명;
배열변수명 = new 데이터타입[데이터갯수]({...});
int[] scores3;
int[] scores3 = new int[10]({10, ...}) // 선언 후 나중에 초기화 하는 경우
  • 배열 객체가 없을 경우 null 값으로 초기화 가능
데이터타입[] 배열변수명 = null;
int[] arr = null;

메모리

  • 원소가 원시타입인 경우
    • 배열 변수에는 첫번째 원소의 주소값만 저장
      -> 원소가 연속적으로 저장되기 때문에 주소 인덱싱을 통해 타 원소 접근 가능

  • 원소가 참조타입인 경우

이차원 배열

  • 행과 열의 테이블 형태의 데이터를 저장할 때 사용
    -> 이차원 배열이라는 개념은 물리적으로 존재 X
데이터타입[][] 배열변수명 = new 데이터타입[][];
int[][] scores = new int[3][3]; // 

이후 일차원 배열과 유사

메모리

  • 원소가 원시타입인 경우
    • 배열 변수에는 첫번째 원소 주소값만 저장
      -> int[] nums2d에는 실제 데이터의 주소가 배열로 저장되어 있음

  • 원소가 참조타입인 경우


배열 비교

  • 배열 이름이 아닌 배열 원소를 반복하면서 비교해야한다.
    -> equals() 사용

배열 복사

  • 배열 이름이 아닌 배열 원소를 반복하면서 비교해야한다.
  • 링크

함수

  • 프로그램의 기능/동작을 정의해놓은 공간
  • 보통 협업 시 개발을 함수 단위로 나누어 개발
  • 함수로 구현된 하나의 기능은 여러 곳에서 동일한 방식으로 호출되어 사용 가능
  • 함수는 기능을 잘 보여주기 위해 동사+목적어 형태로 작성

메서드 : 객체를 구현하기 위한 클래스 내부에 구현되는 함수

  • 멤버 함수라고도 함
반환타입 함수명(매개변수) {
	내용
    return 반환값;
}
  • 함수의 반환값은 하나이거나 없음
  • 반환값이 없을 때는 void를 지정
  • 2개 이상 반환할 시 객체나 배열로 지정 후 반환
    -> ex) return new int[] (x, y);

오버로딩

  • 함수의 이름은 같지만 매개변수에 따라 다른 함수가 호출되는 성질
  • 오버로딩 조건: 매개변수 (개수|순서|타입) 중 하나 이상이 다름
  • 오버라이딩과 혼동 ❌
class A {
	int x, y;
    
    public A() {}
    public A(int x, int y) {...} // 오버로딩
public int add() {...}
public int add(int x, int y) {...} // 오버로딩

재귀함수?

  • 함수에서 자기 자신을 다시 호출해 작업을 수행하는 방식
    -> 재귀함수의 대부분은 반복문으로 바꿔서 구현할 수 있다

vs 반복문

  • 반복문보다 코드의 길이가 짧다
  • 재귀함수 호출과 함께 스택에 적재되고 완료될 때 까지 유지
    -> 많은 메모리 사용

220927 Java 심화 / OOP 이론


정리 ✏️

객체

  • 자신의 속성을 가지고 있고 다른 것과 식별 가능한 것
  • 객체는 필드 (데이터)와 이를 기능하게하는 메서드 (함수)를 가짐

객체 관계

  • is a
    • 상속, inheritance
    • ~는 ~이다.
  • has a
    • 연관, association
    • ~는 ~를 가지고있다.
  • use a
    • 의존, dependency

클래스

  • 객체를 생성하기 위한 설계도
  • 객체의 속성은 클래스의 멤버 변수

객체지향을 할 때

  • 객체를 정의
  • 각 객체의 속성을 멤버변수로 기능을 메서드로 구현하고
  • 각 객체 간의 협력을 구현

인스턴스

  • 클래스를 바탕으로 실제 메모리에 할당(Heap 메모리에 할당된다) 되어 사용하는 실체
  • 객체를 소프트웨어에 실체화하면 인스턴스라고 부름
  • 인스턴스는 각각 다른 멤버변수를 가지게 됨
  • new 키워드를 통해 생성

클래스? 객체? 인스턴스?

  • 클래스 vs 객체
    • 클래스: 설계도
    • 객체: 설계도로 구현한 모든 대상

  • 객체 vs 인스턴스
    • 클래스 타입으로 선언되었을 때 객체라고 부름
      Student student; -> 객체변수라고도 함
    • 객체가 메모리에 할당되어 실제 사용될 때 인스턴스라고 부름
      Student student = new Student();

생성자 (Constructor)

  • new 키워드를 통해 객체를 생성할 때 호출되는 메서드

  • 객체 생성과 동시에 원하는 값으로 초기화할 수 있는 메서드

  • 생성자의 이름은 클래스의 이름과 동일

  • 대부분의 클래스에서는 보통 생성자 오버로딩이 많이 되어있음
    -> 객체 생성을 다양하게 생성할 수 있도록

  • 생성자 정의를 하지않은 클래스는 자바컴파일러가 자동으로 생성함 (디폴트 생성자)
    -> 생성자를 하나라도 생성했을 경우 디폴트 생성자는 생성되지 않는다
    -> 필요 시 기본 생성자도 정의

  • 생성자 내부에서 또 다른 객체의 생성은 좋지않다
    -> 객체의 결합도가 높아짐


캡슐화 (Encapsulation)

  • 관련있는 필드와 메소드를 하나로 묶고 외부에서 접근하지 못하도록 구현하는 방법을 의미

  • 외부에는 통합된 인터페이스만을 제공해서 일관된 기능을 구현하게 함

  • 각각의 메서드나 멤버변수를 접근함으로써 발생하는 오류를 최소화

  • 접근제어자, setter/getter를 통해 캡슐화를 구현한다.

    접근 제어자

    접근제어자같은 클래스 멤버같은 패키지 멤버자식 클래스 멤버그 외
    public⭕️⭕️⭕️⭕️
    protected⭕️⭕️⭕️
    default⭕️⭕️
    private⭕️
  • private: 클래스 내부를 세부적으로 구현하기 위해 사용

  • public: private필드와 프로그램 사이 인터페이스 역할

  • default: 접근 제어자 기본값

  • protected

  • public > protected > default > private

setter / getter

  • 객체를 접근하는데 필드는 숨기고 메서드를 통해서만 접근 가능하게함
  • 메서드 내부에서는 추가적인 로직을 구현 가능 (일종의 필터❗️)

220928 Java 심화 / OOP 이론


정리 ✏️

static

  • 클래스에 고정된 멤버
  • 클래스 로딩 시 같이 로딩되어 메모리 공통영역에 존재하여 별도의 생성과정이 필요 없다.
  • 객체마다 가지고 있어야 할 경우 인스턴스 필드로 선언하지만 공유해야할 값이 있어야할 경우 사용 (학번, 사번, serialNumber)
접근제어자 static 데이터타입 변수명 = 초기값;
private static int serialNum = 1000;
  • 인스턴스 생성과 상관없이 사용 가능하므로 클래스 이름으로 직접 참조
  • static을 이용해 메서드를 만들 경우 인스턴스 생성 전에 호출 될 수 있으므로 static 메서드 내부에서는 인스턴스 변수 사용 불가!!! ❌


singleton pattern

  • 프로그램에서 인스턴스가 단 한개만 생성되어야 하는 경우 사용하는 디자인 패턴

구현방법

  • 생성자는 private로 생성
private Company();
  • 클래스 내부 유일한 private 인스턴스 생성
private static Company instance = new Company();
  • 외부에서 유일한 인스턴스를 참조할 수 있는 public 메서드 제공
public static Company getInstance() {		
	if( instance == null) {
		instance = new Company();
	}
	return instance;	
}

어노테이션

@AnnotationName
  • 주석의 의미
  • 컴파일 과정과 실행 과정에서 코드를 어떻게 컴파일하고 처리할 것인지 알려주는 정보

220929 Java 심화 / OOP 이론

이번 주 객체지향에 대해 어느정도 수업을 듣게되었다.
듣고나서 헷갈리는 부분도 많고 당장은 어떻게 사용해야할지 감이 잘 안와서
어렵긴한데 자꾸 찾아보고 듣다보니 어느정도는 이해할 수 있을지도 😅
(사실은 🤯)

정리 ✏️

상속 (inheritance)

  • 부모가 가진 필드와 메서드를 자식에게 물려주는 것
    -> 접근제어자 private는 자식도 이용 불가
  • 새로운 클래스를 정의할 때 이미 구현된 클래스를 상속받아 속성이나 기능을 확장하여 클래스 구현
  • 이미 구현된 클래스보다 더 구체적인 기능을 가진 클래스를 구현할 때 사용
  • 다중 상속은 불가❗️ (횟수는 제한 ❌)
  • 하위 클래스가 상위 클래스의 속성과 기능을 확장한다는 의미
  • 하위 클래스 생성 시 상위 클래스의 생성자가 먼저 실행 ❗️❗️
자식클래스 extends 부모클래스 {}
public class SportCar extends Car {...}

상속의 장점

  • 코드의 중복을 줄이고 객체간의 관계 지향
  • 코드의 수정 최소화 -> 유지보수 시간 최소화

오버라이드

  • 오버로드와는 별개❗️
  • 메서드 재정의로 상속된 메서드가 자식 클래스에 맞지 않는 경우 자식 클래스에서 동일 메서드를 재정의하는 것
  • 부모 메서드와 동일한 반환타입 / 메서드명 / 매개변수를 가져야한다
  • 접근제한을 더 강하게 오버라이딩 불가! ❌
  • 어노테이션 @Override 사용 가능

상속이 안되는 경우?

  • 부모 클래스의 private로 정의된 필드나 메서드
  • 부모 클래스 자체가 final로 정의된 경우
    -> final은 해당 상태가 최종이므로 더이상의 수정이 불가한 상태

다형성 (Polymorphism)

  • 하나의 코드가 여러 자료형으로 구현되어 실행되는 것
  • 메서드 오버로딩도 다형성 중 하나로 볼 수 있음
  • 상속과 메서드 재정의를 활용하여 확장성 있는 프로그램을 만들 수 있음
  • 상위 클래스에서는 공통적인 부분을 제공하고 하위 클래스에서는 각 클래스에 맞는 기능 구현
  • 여러 클래스를 하나의 타입(상위 클래스)으로 핸들링 할 수 있음

업캐스팅, 다운캐스팅 (형변환)

  • 부모 클래스가 Customer, 자식 클래스가 VIPCustomer 일 때
Customer customer = new VIPCustomer();

위처럼 자식 클래스는 부모 클래스의 타입을 내포하고 있으므로 부모 클래스로의
묵시적 형변환(업캐스팅, promotion) 가능

VIPCustomer vipCustomer = new Customer(); // X

반대로 위처럼 부모 클래스는 자식 클래스로 다운캐스팅이 불가능❗️
-> 자식 클래스는 부모 클래스를 상속받아 추가적인 필드나 메서드를 구현하여 부모 클래스가 사용할 수 없다.

  • 단, 업캐스팅된 클래스는 다시 원래의 타입으로 다운캐스팅 가능
VIPCustomer vipCustomer = (VIPCustomer)customer
// 명시적으로 선언해줘야 함

instanceof

  • 원래의 인스턴스 형이 맞는지 체크하는 키워드
  • 맞으면 ture, 틀리면 false를 반환

가상 메서드

  • 자바에서는 모든 메서드가 가상 메서드이다

  • 부모 객체에서 자식 인스턴스가 있는 경우 부모 클래스의 이름으로 함수를 호출하여도 각자의 자식 인스턴스의 함수가 실행됨

  • Shape 클래스 가상 메서드 테이블

    오버라이딩 유무메서드 주소값
    draw()100
    getCenterPoint()200
  • Circle 클래스 가상 메서드 테이블

    오버라이딩 유무메서드 주소값설명
    draw()⭕️300재정의된 함수 호출
    getCenterPoint()200

재정의 된 경우 다음과 같이 새로운 주소값을 가진다 ❗️


추상 클래스

  • 구현 코드 없이 메서드의 선언만 있는 추상 메서드를 포함한 클래스
  • 추상 메서드는 구현부 없이 선언
abstract class 클래스명
abstract 반환타입 메서드명(매개변수);
  • 추상 클래스는 new를 통한 인스턴스화 불가 ❌
    -> 모든 메서드가 구현되어 있더라도 abstract로 선언된 클래스도 인스턴스화 불가
    -> 익명 객체로 선언하는 방법이 있으나 객체가 계속 유지되지않아 불편

추상 클래스를 사용하는 이유

  • 자식 클래스들을 관리하기 위함
  • 자식 클래스들의 공통적인 특성을 추출해서 선언
  • 자식들을 하나의 객체변수로 관리하기 좋다!
  • 공통적인 필드와 메서드는 추상 클래스에서 선언했기 때문에 실체 클래스를 작성할 때 공통적인 필드나 메서드는 생각하지 않아도되어 시간 절약
  • 추상 클래스 내의 추상 메서드: 하위 클래스가 구현해야 하는 메서드
  • 추상 클래스 내의 구현된 메서드: 하위 클래스가 공통으로 사용하는 메서드

인터페이스

  • 객체 관계에서 부모와 자식 관계만 존재하지 않는다
  • 클래스나 프로그램이 제공하는 기능을 명시적으로 선언
  • 일종의 클라이언트 코드와의 약속이며 클래스나 프로그램이 제공하는 명세
  • 클라이언트는 인터페이스에 선언된 메서드 명세만 보고 이를 구현한 클래스를 사용할 수 있다
  • 하나의 클래스에서 여러 인터페이스를 구현 가능
  • 인터페이스를 구현한 다양한 객체를 사용함으로 다형성의 특징을 가짐
  • 인터페이스를 구현한 클래스는 인터페이스형으로 형변환 가능
  • 인터페이스끼리 상속이 가능하고 다중 상속이 가능하다
interface 인터페이스명 {
	// 상수
    // 추상 메서드
    // 디폴트 메서드
    // 정적 메서드
}
class 클래스명 implements 인터페이스명 {}
  • 접근제어자는 public이여야함 (public이 기본 접근 제어자로 생략 가능)
  • 모든 메서드가 추상 메서드로 선언
  • 디폴트 메서드와 정적 메서드는 JDK 8부터 추가
  • 디폴트 메서드는 인터페이스를 구현하는 클래스에서 재정의 가능하지만 정적 메서드는 불가

한 주 마무리 📚

OOP 개념을 배우고 있는데 다양한 용어들이 나오고 그에 파생되는 용어도 되게 많아서 헷갈리는 부분이 많은 것 같다.
핵심적인 개념을 배웠으니 앞으로 다양한 예제를 접하면서 헷갈리는 부분은 계속 반복적으로 복습해야겠다 😁

0개의 댓글