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
//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 |