개발 공부 회고(23.12 - )/SSG Java 백엔드 과정(23.12 - 24.06)

SSG 3주차 회고 - 객체지향, 상속, 추상클래스, 인터페이스, 모델링

여파고 2024. 1. 7. 00:24

배운 내용

  • 객체지향 프로그래밍-클래스
  • 상속
  • 도메인 모델링
  • 유즈케이스 다이어그램
  • 추상클래스와 인터페이스

 

 

교육 회고

 

3주차에 접어들면서 정신은 더더욱 혼란이 가중된다.

수업 때 바로바로 이해하고 내 것으로 만드는 일은 미루어 두기로 하였다.

대신 수업이 끝난 후에 (간신히) 받아적은 내용들을 바탕으로

공부를 도와주는 학우(ㅎㅎ)들의 도움도 받아서 진도를 이해 하는데에 시간을 할애하고 있다.

이론적인 면에서 모르는 부분이 있을 때는 G선생님도 꽤 도움이 되고 있다.

 

객체지향 이라는 것에 들어가면서, 객체지향이라는 것에 대한 개념이 명징하게 잡히지 않아 공부가 매우 어려워졌다.

그와중에 UML와 유스케이스에 대해서도 아주 중요하게 다뤄서 괴롭다.

자바 만으로도 머리가 깨질 것 같은데 저런 그림놀이(?) 같은게 사실 엄청 중요하다고......? 노우.....

 

다향성, 추상클래스와 인터페이스에 대해서는 추후 다시 천천히 공부하고 개념정리를 하고자 마음 먹었다.

일단 수업시간에 무언가 내용이 있는 것은 닥치는대로 받아적고, 추후에 정리를 해봐야지~ 하는 중이라 내용이 상당히 두서가 없다.

스트레스네

 

 

 

 

객체지향과 클래스

객체지향에서

객체와 클래스란.

객체는 현실세계에 존재하는 모든 것(구체적)

클래스는 개념적으로 객체를 생성 할 수 있는 객체들의 공통된 틀(개념적)

객체지향 프로그래밍(Object_Oriented Programming, OOP)

-제품

부품----> 부품 조립 ----> 완성품

부품을 먼저 만들어가지고. 메뉴얼에 따라 조립해서. 완성품을 만드는것.

 

부품을 제공하는게, Spring(프레임워크)

조립하는건... Spring Container..

객체지향 프로그래밍 특징

1. 캡슐화

객체의 데이터(필드), 동작(메소드)를 하나로 묶고 실제 구현 내용을 외부에 감추는것.

캡슐약처럼 말이지 안보이지만 다 들어가있단말이지

2. 상속

코드의 재사용(중복 코딩 최소화)

유지보수 시간 최소화

부모객체가 자기가 가지고 있는 필드(속성)나 메소드(동작)를 자식객체가 사용할 수 있게

클래스를 설계한 것.

3. 다형성... 굉장히.. 상당히 어렵습니다.

사용방법은 동일하지만, 실행 결과가 다양하게 나오는 성질

다형성을 구현하기 위해서는 자동타입변환(프로모션), 재정의(오버라이딩)

 

 

 

클래스 생성

객체 생성

메소드 생성

및 사용에 대해.

Car 라는 클래스를 만들어주었다.

그 안에 company, model, color, maxspeed 라는 필드를 선언해주었다.

그리고 Car의 객체들을 main메소드에서 인스턴스하기 위해 생성자도 선언해주었다.

그리고 main method에서 Car타입의 myCar1 이라는 객체를 생성해주었다.

 

 

 

UML

프로그램을 설계 할때 좀 모두가 쉽고 편하게 알아먹기 좋게, 그리고 정확하게 시각적으로 설계도를 짠 것

  • UML의 특징 시각화

시각화 -> 원활한 의사소통에 유리하다

명세화

구축언어

문서화

 

모델링

모델링은 개발하고자 하는 프로그램을 시각적으로 표현하는것.

의뢰자의 요구에 맞도록 쉽게 수정해서

결과적으로 유지보수 기간을 줄여 생산성을 높이는 데 목적이 있다.

모델링은

개인이 제어할 수 없는 작업을 할 때,

협업이 필요할 때,

다양한 관점의 설계도가 있어야 할때.

UML을 이용해서 설계도를 만들 수 있다.

객체지향에서

객체와 클래스란.

객체는 현실세계에 존재하는 모든 것(구체적)

클래스는 개념적으로 객체를 생성 할 수 있는 객체들의 공통된 틀(개념적)

Object_Oriented Programming (OOP)

-제품

부품----> 부품 조립 ----> 완성품

부품을 먼저 만들어가지고... 메뉴얼에 따라 조립해서... 완성품을 만드는것..

부품을 제공하는게, Spring(프레임워크)

조립하는건... Spring Container..

 

 

객체지향 프로그래밍-클래스

상속

도메인 모델링..

컴퓨터 세계의 외부에서 요구사항이 주어졌다...
요구사항 중 기능으로 작동할 부분을 추려내서
프로그램 기능으로 구현할 부분을 구체화해서 도식화 하는 작업...
Enum 열거

유즈케이스 다이어그램

필요성

요구 사항 정의는 개발과 설계에서 매우 큰 비중을 차지한다.
(누가 사용, 무엇을 동작, 사용자와 상호작용을 위한 인터페이스?)

인터페이스?→사용자와 프로그램 간의 상호작용을 위한 ... 화면에 표시되는 기능

 

사용자(Actor)와 유즈케이스의 관계

 

시스템 안에 시스템의 기능(유즈케이스)가 있고
시스템 외부에 사용자가 있다.
사용자의 요구사항에 따라 기능(유즈케이스)가 만들어진다.

 

 

UseCase끼리의 관계

○포함관계 - 다른 유즈케이스에서 기존 유즈케이스를 재사용. 돌고 돈다.

○확장관계 - 상위 유즈케이스로부터 특정 조건에 의해 수행될 때.
-기본 유즈케이스를 수정하지 않고 새로운 요구 사항을 추가로 표현할 때.
-기준 유즈케이스 이후의 흐름이 확장 유즈케이스에 의존하지 않는다. 그걸로끝.

○중복관계(꽤 헷갈림)
유스케이스 흐름에서 중복되는 유스케이스가 있을 때 비슷한 카테고리의 유스케이스들을 묶어서 유스케이스를 만들어준다.

○일반화관계(상속) - 갖다씀

 

 

Actor와 UseCase의 사이의 관계

○연관관계(Association)

<서로 정보를 주고 받음->사용자와 유즈케이스 간의 관계를 연결해줌>

 

 

Actor끼리의 관계

○일반화 관계
-추상적인 액터(ex.고객)와 좀더 구체적인 액터(ex.회원, 비회원), 로 관계를 맺어줌.

 

 

 

추상화

 

불필요한 정보를 숨기고 중요 정보만 나타내는 것.
어떤 영역에서 필요한 공통의 속성이나 행동을 추출해서 효율적인 코드 작성 가능

추상화의 필요성

객체간의 복잡성 줄어듦
코드의 중복을 막고 재사용성 높임
중요한 정보만 제공하므로 보안에 유리

추상화의 유형

데이터 추상화(데이터 구조를 보여주지 않음. 처리하는 과정만 보여줌.)
제어 추상화(추상화단위 정의.. 필요시 재사용..)

추상화 구현 방법

추상클래스 또는 인터페이스를 통해 구현할 수 있다.


Car와 Bike의 공통의 속성을 뽑아내서 추상화 클래스를 만들어보기로 했다.

 

 

추상화 실습

최상위 추상화 클래스 Vehicle을 만들고,
두 바퀴(TwoWheeler)와 네 바퀴(FourWheeler)클래스, 자식클래스로 Bike와 Car를 만들었다.

public abstract class Vihecle {
    public abstract void printPrice();
}

추상 메소드 printPrice를 선언해주었다.
이 메소드는 최상위추상화메소드라 아래에서 필수로 쓰일 예정.

public abstract class TwoWheeler extends Vihecle {
    public abstract void printType();

    public abstract void printPrice();
}

TwoWheeler클래스에서는 추상메소드 printType 을 추가해주었다.

public abstract class FourWheeler extends Vihecle {


}

FourWheeler 클래스에는 아무것도 없어서 그냥 클래스만 덩그러니 만들었다.
여기까지가 추상클래스를 만들어두었다.
그리고 이제 자식 클래스들을 만들었다.

public class Bike extends TwoWheeler {
    @Override
    public void printType() {
        System.out.println("이것은 자전거 입니다.");

    }
    @Override
    public void printPrice(){
        System.out.println("가격 : 150,000");
    }

    public void printBrand(){
        System.out.println("브랜드 : 삼천리");
    }
}

Bike클래스는 TwoWheeler클래스를 상속받고
printBrand메소드를 선언해주었다.
상위 클래스의 메소드들을 오버라이딩해서
printType과 printPrice에 출력문을 넣어 주었다.
그리고 메인 클래스를 myBike라 하여 만들어서

public class MyBike {
    public static void main(String[] args) {
        Bike mybike = new Bike();
        mybike.printType();
        mybike.printPrice();
        mybike.printBrand();
    }
}

Bike 인스턴스를 생성해서
해당 메소드들을 실행할 수 있었다.
Car도 뭐 비슷하게 함.^^.

 

 

인터페이스

 

추상 클래스와 마찬가지로 그 자체의 객체를 만들 수 없다.
추상 메소드만 포함할 수 있다.

필요성

완전한 추상화를 구현할 수 있다.
다중 상속을 구현할 수 있다.
느슨한 결합 관계를 형성할 수 있다.

인터페이스의 선언

interface 키워드를 사용하여 선언
default 와 public만 붙일 수 있다.

반응형