[패스트캠퍼스: Java&Spring 웹 개발] Week 2 - OOP Basic

2023. 6. 12. 00:44Learn

728x90

본 게시글은 내일배움카드로 신청한 패스트캠퍼스의 국비지원교육 강의: Java&Spring 웹 개발입니다.

본 게시글은 패스트캠퍼스의 열공 챌린지 형식을 준수하며, 개인적인 정리 목적으로 학습 내용을 정리한 글입니다.

- 제목, 본문, 해쉬태그 키워드 포함

- 사진 1장 이상, 글자수 500자 이상 (공백 포함, 코드 제외)

 

학습 자료: https://gitlab.com/easyspubjava/javacoursework/-/tree/master/Chapter2


객체와 객체지향 프로그래밍

  • 객체 - Object; 엔티티 - Entity; 도메인 - Domain
  • 멤버 변수, 멤버 함수 (메서드; 협력 - Collaboration, 상호작용 - Interaction)
  • 추상화 작업을 통해 객체의 속성, 역할 및 책임을 정의해야 한다.

생활 속에서 객체 찾아 클래스로 구현해보기

  • 클래스의 멤버 변수에 Object-unique ID 포함하기
  • 접근제어자 public으로 선언된 class의 개수는 파일 당 1개로 제한하고, 파일 이름은 그 class 이름과 동일해야 한다.
  • Java에서는 기본적으로 camel-notation (naming convention)을 사용한다.
  • 단, 클래스명은 대문자로 시작하도록, package명은 소문자로만 구성되도록 주의한다.

함수와 메서드

  • 매개변수(parameter: 함수 정의 간 필요 변수)
  • 인자(argument: 함수 호출 간 전달되는 변수)
  • 함수 호출(call): 메모리 공간 - 스택(stack): 메모리 로드: 블록: 지역 변수: 함수 종료(return) 시 메모리 반환(free)
  • 메서드 명은 동사로 시작하여, 사용하는 객체명을 명시하는 것이 좋다.

객체의 속성은 멤버 변수로, 객체의 기능은 메서드로 구현한다

  • getter / setter: private 멤버 변수에 대한 R/W method
역할 동사 예제
C: create create, make, start, initiate
R: read read, get, find, show, search, retrieve
U: update update, set, assign, change, convert
D: delete delete, remove, kill, stop, cancel

인스턴스 생성과 힙 메모리

  • 객체의 정의: Class
  • 객체의 생성: Instance
  • 동적 할당(malloc) or 객체 생성(new): 메모리 공간 - 힙(Heap): Java Garbage Collection에 의해 메모리 반환
  • 참조 변수: 메모리에 생성된 인스턴스를 가리키는 변수
  • 참조 값: 메모리에 생성된 인스턴스를 가리키는 변수

Reference Variable in Java - GeeksforGeeks

 

Reference Variable in Java - GeeksforGeeks

A Computer Science portal for geeks. It contains well written, well thought and well explained computer science and programming articles, quizzes and practice/competitive programming/company interview Questions.

www.geeksforgeeks.org

** 클래스 정의 과정이 낯설다면, 실행하고 싶은 명령(테스트)을 먼저 기술하고, 오류 없이 실행되도록 역설계해보자.
TDD: Test Driven Development

생성자에 대해 알아봅시다

  • 원시 타입(primitive type): 생성자 불필요
  • 모든 클래스에는 생성자가 존재
  • 미정의 시, 컴파일러에 의해 기본 생성자 강제 삽입. 단, 이로 인해 의도치 않은 동작이 발생할 수 있으니 지양.
  • 일반적으로 생성자를 직접 호출하기 위해 public으로 정의한다. 단, 특정한 목적을 달성하기 위해 외부에서의 생성자 호출을 제어하고자 private로 정의하기도 한다. 대표적인 예시로 Singleton Design Pattern이 있다.
  • client / server-side code (API: Application Programming Interface)
  • 지역 변수의 가시성(visibility): Block의 범위에 따라 동일 명칭을 가진 가장 가까운 변수 참조

여러가지 생성자를 정의하는 생성자 오버로딩(overloading)

  • 일반적으로 Client Code에서의 편의성 제공: 필요한 인자만 선택적으로 전달하여 초기화하도록 구현 가능
  • 매개변수의 수에 계승으로 비례하여 기하급수적으로 필요한 생성자의 수가 증가하는 문제
  • >> Kotlin에서는 변수명으로 직접 대입이 가능
  • >> Java에서는 Builder Pattern을 활용

복습해봅시다 (객체 구현하기)

* Constructor Overloading을 생각하니, Builder 패턴이 생각나 재미삼아 구현해봤다.

Java OOP, Builder 패턴을 사용한 Person 클래스 정의 (tistory.com)

 

Java OOP, Builder 패턴을 사용한 Person 클래스 정의

조건 1: 최초 생성 후 수정이 불가능해야 한다. 조건 2: Instance 생성 시, name을 제외한 모든 속성에 대한 인자는 optinal이다. 조건 3: Instance를 구분할 수 있는 unique key값이 필요하다. 특징 (조건 1 완

spems.tistory.com

Builder 패턴을 활용한 Person 클래스 정의

참조 자료형 변수

  • 참조 자료형: String, Date, Student
  • 클래스를 생성할 때, 그 정체성(유일성)을 살려야 한다.
  • 예를 들어, 학생 클래스에 수강 과목 정보를 포함하고 싶다고 하자.
    설령 모든 학생이 수강하는 과목이 동일하다고 하더라도, 수강 과목은 학생 고유의 속성으로 보기 어렵다.
    그보단 학생과 과목이 수강이라는 관계로 이어진다고 보는 것이 자연스럽다.
    DB 이론 중 Entity의 정의 및 관계 설정과 비슷한 느낌.

접근 제어 지시자(access modifier)와 정보은닉(infomation hiding)

  • public : 클래스의 외부 어디서나 접근 할 수 있음
  • private : 같은 클래스 내부에서만 접근 가능 ( 외부 클래스, 상속 관계의 클래스에서도 접근 불가)
    - getter / setter로 내부에 접근하는 API를 만들 수 있으며, 이처럼 정해진 방법으로 접근을 통제할 수 있음
    - IDE 내부 Generate을 통해 손쉽게 생성 가능 
  • 생략(default) : 같은 패키지 내부에서만 접근 가능 ( 상속 관계라도 패키지가 다르면 접근 불가)
  • protected : 같은 패키지나 상속관계의 클래스에서 접근 가능하고 그 외 외부에서는 접근 할 수 없음
    - 다른 패키지를 사용하려면 import (package) 해야 한다.

캡슐화 (encapsulation)

  • 접근 제어자 private/protected 사용
  • 일관된 소수의 API만 Client에게 공개하고, 나머지는 은닉.
    물론 고정적이면 사용은 편하지만, 확장성을 위해선 유연성도 중요. 
  • 일반적으로도 모든 정보를 공개하는 것보다 중요한 핵심 정보 위주로 제시하는 것이 전달력이 더 좋다.
    보안의 측면에서도 Reverse Engineering 방지 이점.

교안 내용

객체 자신을 가리키는 this

  • 소속 객체(heap)의 참조값 반환
  • 객체 생성 시점에서 this 키워드로 생성자를 호출할 수 있다.
    예를 들어, 기본 생성자 내 this("Tom", 37)로 Person 객체 생성에 대한 기본값 설정도 가능
    (단, 생성자에서 다른 생성자를 호출하는 경우, 인스턴스의 생성이 완전하지 않은 상태이므로 this() statement 이전에 다른 statement를 쓸 수 없음.)

객체 간의 협력 (collaboration) 

  • 각 개체의 API를 활용하며 발생하는 객체 간 interaction
  • 일반적으로 public method 활용하며, 멀티쓰레딩 프로그래밍에서는 동기화 이슈 반드시 고려해야함

버스 타고 학교 가는 학생의 과정을 객체 지향 프로그래밍으로 구현해보기

(생략)

복습해봅시다 (객체 협력)

(생략)

여러 인스턴스에서 공통으로 사용하는 변수를 선언하자 - static 변수

  • 새로운 객체가 생성될 때, 생성자를 호출한 블록 안의 지역 변수는 메모리의 스택 영역에 생성되고, 그렇게 생성된 인스턴스는 힙 영역에 생성된다. 만약 그 클래스가 static 멤버를 지닌다면, 데이터 영역에 생성된다.
질문
답변

static 메서드의 구현과 활용, 변수의 유효 범위

static 응용 - 싱글톤 패턴 (singleton pattern)

timezone 클래스에 의해 생성되는 날짜 객체

특정 회사 클래스에 대한 객체

class Company {

	private Company() {}
	private static Company instance = new Company();

    public static Company getInstance() {
        if( instance == null) {
            instance = new Company();
        }
        return instance;
    }
    
}

복습해봅시다 (static과 싱글톤 패턴)

(생략)

자료를 순차적으로 한꺼번에 관리하는 방법 - 배열(array)

  • 일반 array는 논리적 위치(순서)가 물리적 위치와 대응된다. 대응되지 않는 자료구조의 대표적이 예시 중에는 연결 리스트가 있다.
  • 선언한 배열의 일부만 초기화하여 사용하는 경우, length를 사용했을 때, 의도치 않은 연산 결과를 얻을 수 있다.
    -> 이 경우 연산에 지장없는 값으로 초기화하거나, 별도의 count 변수를 둔다.

객체 배열 사용하기

얕은 복사: System.arrayCopy(src, srcPos, dest, destPos, length)

2차원 배열 사용하기

.length는 최상위 차원의 개수를 반환

객체 배열을 구현한 클래스 ArrayList

Generic Type Class

size() != length ()

Eclipse 내 F1으로 Java reference 참조 가능

ArrayList 활용한 간단한 성적 산출 프로그램

(생략)


마치며...

대체적으로 모두 아는 내용이었는데, static 생성 시점에 대한 개념을 바로 잡을 수 있는 좋은 기회였다.

실습하며 builder 패턴을 사용해보는 계기가 되었던 것도 좋았다.

 

728x90