[5일 차] 소프트웨어 엔지니어링 (Ch07 ~ Ch08)

2025. 1. 24. 14:57·LG 유플러스 유레카/소프트웨어 엔지니어링

25/01/24 (금)

즐거운 금요일입니다.

어제는 새우빼기와 우빠(브릿지)로 가드패스를 통과했습니다. 뿌듯하더라고요

오늘은 수업 끝나고 주짓수를 간단히 한 후 놀러가려고 합니다. (매우 신남)

내일부터 설 연휴기간이니 즐겁지만 기사공부는 해야죠.. 

아무튼 힘내봅시다.

맞다 연휴 끝나고 자기소개 발표 제 차례인데 강사님께서 기대한다고 하시니 어쩌죠..


 

1.  WorkShop 발표

1) Has a, Is a 관계

상속이란 기존의 클래스를 재사용해 새로운 클래스 작성하는것

 

Is-a 관계(상속관계) : A is a B라는 관계는 A는 B의 일종이다는 의미 (Dog is an Animal)

has-a 관계(포함관계) : A has a B 관계는 A는 B를 가진다는 의미 (Car has an Engine)

 

WorkShop> 다들 Team 하나씩 맡아서 java파일 만들고 한명이 rand파일을 만들어서 취합하는 방식으로 진행해봐라

 

2) Getter, Setter 남용 시의 문제점?

다른 조에서 Getter, Setter 남용시 문제점을 발표했는데

강사님께서 계속 말씀하셨던 블로그 글에서 잘못된 정보의 확대, 재생산 문제의 예시였습니다.

Setter대신 다른 메소드를 사용하자고 했는데 이는 틀렸다고 말씀하셨습니다.

 

2) Singleton Patter

단 하나의 유일한 객체를 만들기 위한 코드 패턴 : 메모리 절약을 위해 인스턴스가 필요할 때 기존 인스턴스 활용

쓰레드까지 발표하셨는데 너무 예습이라 필기하지 않았습니다.

 

2.  강의

2.1.  CH7 상속

1) Override

OOP 3가지

  • Encapsulation <- access modifier와 setter, getter 구조
  • Inheritance : 상속 만들기, 부모 자식 접근
  • Polymorphism : 타입(상위 타입, 하위 타입), 메소드 (Overloading, Overriding)
package ch07.methodpoly;

public class MyClass {
    int n;
    String str;

    @Override // 어노테이션
    public String toString() {
        return "n = "+n+", str = "+str;
    }
}
======================================================
package ch07.methodpoly;

public class Test {
    public static void main(String[] args) {
        // MyClass vs Object
        MyClass mc = new MyClass();
        System.out.println(mc.toString());
    }
}

화장실 갔다와서 잘 못들었는데

println을 부모 클래스로 삼아 toString 메소드로 Override하는 것 같습니다.

> 다시 공부하기

더 공부할 것> 메소드 시그니처, Overloading, Override

 


package ch07.methodpoly;

import java.io.IOException;

public class Super {
    // primitive type return
    int m(){
        System.out.println("Super -m()");
        return 1;
    }

    // reference type return
    B m2() {
        System.out.println("Super -m2()");
        return new B();
    }

    // access modifier
    // private - default - protected - public
    protected void m3() {
        System.out.println("Super -m3()");
    }

    // Exception <- IOException <- FilleNotFoundException
    void m4() throws IOException {
        System.out.println("Super -m4()");
    }
}
  • reference type return : 다형성에 의해 하위 클래스 리턴 가능
  • private - default - proctectd - public (Access modifier) : 부모 클래스의 접근 제한을 더 줄일 수 없다.
  • Exception <- IOException <- FileNotFounException : 부모 클래스의 예외보다 더 일반적인 예외 처리를 할 수 없다.

더 공부할 것> throws Exception 작동

WorkShop> 가변인자 Overriding은 어떻게 할 것인지 알아보아라

 


package ch07.methodpoly;

public class A {
    void a() {System.out.println("A - a()");}
}

class B extends A {
    void a(int i) {System.out.println("B - a(i)");}
    void b() {System.out.println("B - b()");}

}

class C extends B {
    void a() {System.out.println("C - a()");}
    void c() {System.out.println("C - c()");}
}

class D extends C {
    void a(int i) {System.out.println("D - a(i)");}
    void b() {System.out.println("D - b()");}
    void d() {System.out.println("D - d()");}
}

어떻게 Overriding이 작동하는지 원리라고 합니다. 잘 모르겠어서 점심시간에 질문해야겠습니다.

 


보조 강사님> 바로 윗클래스만 상속됩니다.더 찾아보니 C++에서는 다중상속을 지원하지만 Java, Python에서는 다중상속을 지원하지 않는다고 합니다.

 


출력은 이렇게 된다고 합니다.
WorkShop> 1인 1문제 만들어서 상호 풀기 

 

2) 객체 타입 확인

            System.out.println(a instanceof A); //t
            System.out.println(b instanceof B); //t
            System.out.println(c instanceof C); //t
            System.out.println(d instanceof D); //t

            System.out.println(a instanceof A); //t
            System.out.println(b instanceof A); //t
            System.out.println(c instanceof A); //t
            System.out.println(d instanceof A); //t

            System.out.println(a instanceof B); //f
            System.out.println(b instanceof B); //t
            System.out.println(c instanceof B); //t
            System.out.println(d instanceof B); //t

            System.out.println(a instanceof C); //f
            System.out.println(b instanceof C); //f
            System.out.println(c instanceof C); //t
            System.out.println(d instanceof C); //t

            System.out.println(a instanceof D); //f
            System.out.println(b instanceof D); //f
            System.out.println(c instanceof D); //f
            System.out.println(d instanceof D); //t

            // A의 객체(B,C,D의 객체일수도 있는)가 전달 되었을 때
            // 서로 다른 객체 구별처리
            A x = new C();
            if(x instanceof D){
                System.out.println("D 객체");
            }else if(x instanceof C){
                System.out.println("C 객체");
            }else if(x instanceof B){
                System.out.println("B 객체");
            }else if(x instanceof A){
                System.out.println("A 객체");
            }

instanceof : 매개변수가 아니더라도 변수가 참조하는 객체의 타입을 확인할 때 사용하는 연산자

좌항의 객체가 우항의 타입이면 true 출력

 

boolean result =  a instanceof b;

 

3) 추상(Abstract) 클래스

추상 클래스

객체를 생성할 수 있는 

 


추상 클래스 선언

추상 클래스 안에 일반 메소드 만들기가 불가능하고 abstract 메서드가 강제됩니다.

 


 

추상 메소드와 재정의

  • 자식 클래스들이 가지고 있는 공통 메소드를 뽑아내어 추상 클래스로 작성할 때, 메소드 선언부만 동일하고 실행 내용은 자식 클래스마다 달라야 하는 경우 추상 메소드를 선언할 수 있음
  • 일반 메소드 선언과의 차이점은 abstract 키워드가 붙고, 메소드 실행 내용인 {}가 없다.

 

4) 봉인된(Seald) 클래스

sealed 클래스

 

2.2.  CH8 인터페이스

1) 인터페이스의 역할

상속과 인터페이스를 잘 구분해야합니다.

그래야 중급으로 갈 수 있습니다.

 

2) 인터페이스와 구현 클래스 선언

인터페이스 선언 : class 대신 interface로 선언


 

구현 클래스 선언 : 인터페이스에 정의된 추상 메소드에 대한 실행 내용이 구현

 

변수 선언과 구현 객체 대입

  • 인터페이스는 참조타입
  • 인터페이스를 통해 구현객체를 사용하려면, 인터페이스 변수에 구현 객체를 대입해야한다.

와 근데 진짜 하나도 모르겠는데요 (다시 공부하기)

 

3) 디폴트 메소드

[public] default 리턴타입 메소드명(매개변수, ...) { ... }
  • 인터페이스에는 완전한 실행 코드를 가진 디폴드 메소드를 선언할 수 있다.
  • 추상 메소드는 실행부{}가 없지만 디폴드 메소드는 있다. default 키워드가 리턴 타입 앞에 붙는다.
  • 디폴트 메소드의 실행부에는 상수 필드를 읽거나 추상 메소드를 호출하는 코드를 작성할 수 있다.

 

4) 다중 인터페이스

다중 인터페이스

 

public interface 자식인터페이스 extends 부모인터페이스1, 부모인터페이스2 { ... }
// interface도 extends 사용

인터페이스 상속

WorkShop> extends 뒤에 인터페이스 나열

 

타입 변환

 

강제 타입 변환

 

5) 다형성

OS와 프린트 그리고 드라이버 관계와 같습니다.

 

6) 객체 타입 확인

instanceof 연산자 : 인터페이스에서도 사용 가능

강사님> 백엔드 개발 할때는 쓸 일이 없을겁니다. 배열도 안써요 Collections씁니다.

 

7) 봉인된(sealed) 인터페이스

클래스와 동일


강사님께서 최종적으로 추가로 설명해주셨습니다.

 

3.  마무리

1) WorkShop

WorkShop> 다들 Team 하나씩 맡아서 java파일 만들고 한명이 rand파일을 만들어서 취합하는 방식으로 진행해보자

WorkShop> 가변인자 Overriding은 어떻게 할 것인지 알아보자

 

WorkShop> 인터페이스 상속을 구현해보자

 

더 공부할 것> 메소드 시그니처, Overloading, Override, throws Exception, 인터페이스, 가변인자(...)

 

WorkShop> Overriding 1인 1문제 만들어서 서로 문제를 풀어보자

저희 조 코딩천재 한윤수님께서 낸 문제입니다.

1번 문제는 풀었지만 2번 문제는 진짜 어려워서 손도 못댔습니다.

생성되는 순서로 푸는 문제여서 '답이 C인가..?'하다가 풀이를 듣고 진짜 더 공부해야겠다는 생각이 들었습니다.

 

 

2) 오늘 식단

<아침> 프로틴과 바나나(사진 안찍음) <점심> 김치만두(사실 감자탕에도 밥도 볶아먹음) <저녁> 은 나가서 놀면서 먹어야지 

집앞에 '단월'이라는 진짜 맛있고 분위기 좋은 술집이 있습니다. (비쌈)

정말 제가 좋아하는 술집인데 오늘 동생들이랑 셋이 갈듯합니다.

여자친구랑 꼭 한번 가보고싶은데 장거리라 꿈도 못꿈니다..

 

그런데 동생놈이 맨날 돈없다고 제가 계산해서 싼거 먹으러 갈수도있어요. (나도 돈 없음)

형석아 진짜 사줄때마다 감사하면서 먹어라

'LG 유플러스 유레카 > 소프트웨어 엔지니어링' 카테고리의 다른 글

[6일 차] 소프트웨어 엔지니어링 (Ch08 ~ Ch12)  (0) 2025.02.03
[4일 차] 소프트웨어 엔지니어링 (Ch06 ~ Ch07)  (3) 2025.01.23
[3일 차] 소프트웨어 엔지니어링 (Ch05 ~ Ch06)  (1) 2025.01.22
'LG 유플러스 유레카/소프트웨어 엔지니어링' 카테고리의 다른 글
  • [7일 차] 소프트웨어 엔지니어링 (Ch13 ~ Ch16)
  • [6일 차] 소프트웨어 엔지니어링 (Ch08 ~ Ch12)
  • [4일 차] 소프트웨어 엔지니어링 (Ch06 ~ Ch07)
  • [3일 차] 소프트웨어 엔지니어링 (Ch05 ~ Ch06)
문태신
문태신
꾸준함은 모든 것을 이긴다.
  • 문태신
    별 될 시간
    문태신

  • 전체
    오늘
    어제
    • 전체 글 (122) N
      • LG 유플러스 유레카 (109) N
        • 강의 정리 (1)
        • 소프트웨어 엔지니어링 (8)
        • 알고리즘 (13)
        • 데이터베이스 활용 (5)
        • 미니 프로젝트 1 (3)
        • 데이터베이스 심화 (5)
        • 프론트엔드 이해 (3)
        • 깃허브 특강 (2)
        • 취업 특강 (2)
        • 스프링 프레임워크 (17)
        • REST API (10)
        • 미니 프로젝트 2 (7)
        • 프로젝트 기획 분석 설계 (5)
        • 애자일 방법론 (5)
        • 종합 프로젝트 (15)
        • 클라우드 특강 (3)
        • 최종 융합 프로젝트 (4) N
        • 회고 (1)
      • 알고리즘 공부 (5)
      • 자바 공부 (3)
      • 자격증 (2)
      • 디자인 (2)
      • 감상문 (1)
        • 책 (0)
        • 영화 (1)
  • 인기 글

  • 최근 글

  • 최근 댓글

  • hELLO· Designed By정상우.v4.10.3
문태신
[5일 차] 소프트웨어 엔지니어링 (Ch07 ~ Ch08)
상단으로

티스토리툴바