[7일 차] 소프트웨어 엔지니어링 (Ch13 ~ Ch16)

2025. 2. 4. 11:30·LG 유플러스 유레카/소프트웨어 엔지니어링



25/02/04 (화)

어제는 스파링을 했습니다.

스파이더 가드를 배워서 이거 하나만 써먹는데 좋더라고요.

스파이더 가드 -> 스윕 or 트라이앵글 초크로 넘어가는 연습을 많이 해야겠습니다.

시간이 없다는 핑계를 안좋아하지만 요즘 정말 시간이 없습니다.

눈을 뜬 순간부터 감기 전까지 공부랑 운동을 쉬지않고 하고있는데 그럼에도 시간이 턱없이 모자릅니다..

더 노력해봐야죠!

오늘 배울 내용을 외우지말고, 이해하는게 좋다고 말씀하셨습니다.


 

1.  WorkShop 발표

1) StringBuffer, StringBuilder

  • StringBuffer와 StringBulider의 성능 차이를 비교하는 조가 많았습니다.
  • StringBuilder는 가변, 안전하지 않고 연산속도는 가장 빨랐으나
  • StrigBuffer 가변, 안전, 빠름의 특성을 가졌습니다.

 

2.  강의

2.1.  CH13 제네릭

1) 제네릭이란?

public class Box <T> {
    public T content;
}
======================================================================
Box<String> bx = new Box<String> (); -> Box<String> box = new Box<>();
  • 결정되지 않은 타입을 파라미터로 처리하고 실제 사용할 때 파라미터를 구체적인 타입으로 대체
  • <T>는 T가 타입 파라미터임을 뜻함

 

2) 제네릭 타입

package ch13;

//한 개의 타입이 아닌 여러 타입 (String, Integer, ...)의 객체를 담고자 함
//public class Box {
//    //Object는 모든 타입을 담을 수 있지만
//	//사용 시 instanceof로 어떤 타입인지 확인, 형 변환도 해야 함
//    public Object content;
//}

public class Box<T> {
    public T content;
}
=========================================================================
package ch13;

public class Test {
    public static void main(String[] args) {
        //Generic T
        Box<String> box1 = new Box<>();
        box1.content = "문태신";

        Box<Integer> box2 = new Box<>();
        box2.content = 990107;
    }
}
  • 결정되지 않은 타입을 파라미터로 가지는 클래스와 인터페이스
  • 선언부에 <>

다중 제네릭 타입

package ch13;

//다양한 제품을 표현하고자 함 (종류, 모델명)
public class Product<K, M> {
    private K kind;
    private M model;

    public K getKind(){
        return kind;
    }
    public void setKind(K kind){
        this.kind = kind;
    }
    public M getModel(){
        return model;
    }
    public void setModel(M model){
        this.model = model;
    }
}
===========================================================
package ch13;

public class Test {
    public static void main(String[] args) {
        //Generic T
        Box<String> box1 = new Box<>();
        box1.content = "문태신";

        Box<Integer> box2 = new Box<>();
        box2.content = 990107;

        //복수개의 generic
        Product<TV, String> product1 = new Product<>();
        product1.setKind(new TV());
        product1.setModel("OLED");

        Product<Car, String> product2 = new Product<>();
        product2.setKind(new Car());
        product2.setModel("Porsche");
    }
}
  • 제네릭을 여러개 쓸  수 있음

인터페이스 제네릭

//뭔가를 빌려주는 기능을 표현
//뭔가의 타입을 여러개로 표현(Car, Home)
public interface Rentable <P> {
    P rent();
}
======================================================================
package ch13;

//Car를 빌려주는 실제 구현체
//Generic P를 가진 Rentable 인터페이스를 사용하므로 이때, 타입을 지정
public class CarAgency implements Rentable<Car>{
    @Override
    public Car rent() {
        return new Car();
    }
}
======================================================================
main.java

//인터페이스와 generic
Rentable<Home> homeAgency = new HomeAgency();
Home home = homeAgency.rent();

 

3) 제네릭 메소드

//메소드와 generic
//main()과 별개인 static method 생성
//Test 클래스에는 generic이 없음

//<T>가 메소드 return 앞에 표현
//Parameter로 T 타입의 객체를 받는다
//Box<T> 객체를 reuturn
public static <T> Box<T> boxing(T t) {
    Box<T> box = new Box<>();
    box.content = t;
    return box;
}
  • 타입 파라미터를 가지고 있는 메소드. 타입 파라미터가 메소드 선언부에 정의
  • 리턴 타입 앞에 <> 기호 추가하고 타입 파라미터 정의 후 리턴 타입과 매개변수 타입에서 사용
  • 타입 파라미터 T는 매개값의 타입에 따라 컴파일 과정에서 구체적인 타입으로 대체

 

4) 제한된 타입 파라미터

public <T extends 상위타입> 리턴타입 메소드(매개변수, ...) { ... }
//T는 모든 타입의 객체가 아닌 Number를 포함한 Number의 하위 클래스로 제한
//제한된 타입은 super(상위 클래스) 사용 불가
public static <T extends Number> boolean compare(T t1, T t2) {
    return t1.doubleValue() == t2.doubleValue();
}

//제한된 generic T
System.out.println(compare(10, 30));
  • 모든 타입으로 대체할 수 없고, 특정 타입과 자식 또는 구현 관계에 있는 타입만 대체할 수 있는 타입 파라미터

 

5) 와일드카드 타입 파라미터

리턴타입 메소드명(제네릭타임<? extends Student> 변수) { ... }
리턴타입 메소드명(제네릭타임<? super Worker> 변수) { ... }
리턴타입 메소드명(제네릭타임<?> 변수) { ... }
//과목 등록
//Course 가 generic 타입을 사용 X
//Course의 메소드가 파라미터를 갖는데, 그 파라미터 타입 ()
public class Course {
    public static void registerCourse1(Applicant<?> applicant) {
        System.out.println(applicant.kind);
    }

    public static void registerCourse2(Applicant<?> applicant) {

    }

    public static void registerCourse3(Applicant<?> applicant) {

    }
}
  • 제네릭 타입을 매개값이나 리턴 타입으로 사용할 때 범위에 있는 모든 타입으로 대체할 수 있는 타입 파라미터 ?로 표시

WorkShop> 와일드카드 타입 파라미터 테스트 코드를 짜보자

 

2.2. Ch15 컬렉션 자료구조

1) 컬렉션 프레임워크

  • 객체들을 효율적으로 추가, 삭제, 검색할 수 있도록 관련된 인터페이스와 클래스가 java.util 패키지에 존재
  • 주요 인터페이스 : List, Set, Map

 

2) List 컬렉션

  • 객체를 인덱스로 관리하기 때문에 객체를 저장하면 인덱스가 부여되고 인덱스로 객체를 검색, 삭제할 수 있는 기능을 제공

ArrayList

ch15.test

//index 기반 순회
for (int i = 0; i < list.size(); i++) {
    System.out.println(list.get(i));
}

//foreach 기반 순회
for (Board board : list) {
    System.out.println(board);
}

//literator 순회
Iterator<Board> iterator = list.iterator();
while (iterator.hasNext()) {
    Board board = iterator.next();
    System.out.println(board);
}

//literator 기반 삭제
Iterator<Board> itr2 = list.iterator();
while (itr2.hasNext()) {
    Board board2 = itr2.next();
    if(board2.equals(board)) itr2.remove();
}
System.out.println(board);
  • ArrayList에 객체를 추가하면 내부 배열에 객체가 저장되고 제한 없이 객체를 추가할 수 있음
  • 객체의 번지를 저장, 동일 객체 동일 번지 저장, null 저장 가능
  • 중간 객체 추가, 삭제시 1칸씩 밀려 빈번한 수정이 일어나는 곳에는 바람직하지 않음

Vetcor

  • 동기화된 메소드로 구성되어 있어 멀티 스레드가 동시에 Vetcor()메소드를 실행할 수 없음 (Thread safe)
  • 멀티 스레드 환경에서는 안전하게 객체 추가, 삭제 가능

LinkedList

  • 인접 객체를 체인처럼 연결해서 관리
  • 객체 삭제, 삽입이 빈번한 곳에서 ArrayList보다 유리

 

3) Set 컬렉션

  • 저장 순서가 유지되지 않음
  • 객체 중복 저장 안됨, 하나의 null만 저장 가능 (순서X, 중복X)
  • 데이터를 빠르게 찾을수 있음

HashSet

Set<String> set = new HashSet<>();
set.add("java");
  • 동등 객체 중복 저장X

 

4) Map 컬렉션

 

5) 검색 기능을 강화시킨 컬렉션

 

6) LIFO와 FIFO 컬렉션

 

7) 동기화된 컬렉션

 

8) 수정할 수 없는 컬렉션

 

2.3. Ch16 람다

1) 람다식이란?

람다식

action((x, y) -> {
    System.out.println(x + y);
});
  • 함수형 프로그래밍 : 함수를 데이터 처리부로 보내서 데이터를 처리하는 방식
  • 데이터 처리부 : 입력값을 받아 함수에 정의된 대로 실행
  • 람다식 : 데이터 처리부에 넘길 함수 역할을 하는 코드 블록
  • 자바의 람다식 : 익명 구현 객체로 변환됨
  • 람다식을 쓰려면 Functional Interface 반드시 필요
  • Funcional Interface : 매서드 1개만 있는 인터페이스

 

3.  마무리

1) WorkShop

WorkShop> 와일드카드 타입 파라미터 테스트 코드를 짜보자

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

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

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

  • 최근 글

  • 최근 댓글

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

티스토리툴바