I. 진행목표
•
SSG 교본 8069로 공부 한 사람→8174 보고 나머지 따라하기
•
내일부터 진행할 웹프로그래밍
서블릿을 이용해서 제품을 만든다
리눅스 띄워서 배포하고 연동하고 코드에디터로 잘 만들 예정.
AWS 사용X
네이버클라우드 플랫폼 사용 O
(10만원 지급->4~5개월은 힘듦->피드백 응하면 80만원 지급)
-목표
-유사 스프링 프레임워크를 직접 구현
-기타 라이브러리까지 구현
- 유사 마이바티스
-파일업로드
-실무팁
-루트A
-단순한 버전의 커뮤니티 사이트
-루트B (루트 A 다 하면)
-위에 말한 목표를 다 수행한다
Plain Text
복사
회원가입
회원로그인
자유게시판 글쓰기
자유게시판 글수정
자유게시판 글삭제
자유게시판 글리스트
자유게시판 글상세
글 수정시 권한체크
글 삭제시 권한체크
---------------------
회원 아이디 찾기
회원 비번 찾기
가입환영 메일
임시비번 사용 알림
2차 인증
댓글
파일업로드
Plain Text
복사
II. JAVA & 자료구조
1. 제너릭(Generic)
•
제네릭의 필요성
◦
int 버전, double 버전, 사과 버전 등 여러가지 버전에 따라 ArrayList를 따로 만들기 불편 →
◦
모든 타입을 다 받을 수 있는 Object 버전으로 → 범용성up
◦
그러나 int버전에서 가능했던 형변환없이 산술연산은 불가능
◦
int 타입 인수가 들어갈 때 Integer→Object로 타입을 변질돼서 들어가기 때문에 산술연산으로 값을 출력할 때도 형변환을 해줘야 됨
⇒ 모든 타입 다 받고 출력할 때 자동형변환까지 해주는 자바 고급 기능→제너릭
•
제너릭의 본질: 미완성 클래스
•
적용: 거의 비슷한데 아주 사소하게 다른(ex.자료형 타입만 다른) 로직들
•
자주 사용하는 타입 인자
◦
<T> → Type
◦
<E> → Element
◦
<K> → Key
◦
<N>→ Number
◦
<V>→ Value
◦
<R> → Result
2. ArrayList와 제너릭
문제 1 : 제너릭을 이용해서 클래스 3개를 1개로 줄여주세요.
•
타입이 구체적으로 정해지지 않은 미완성 클래스(<타입인자: 미지수>)로 두고 사용하는 시점에복사해서 어떤 자료형 사용할 것인지 지정
•
main에서 <자료형 타입>으로 a저장소1,a저장소2, a저장소3 생성(new)하면 해당 자료형타입으로 클래스가 생성
code (before)
code (after)
문제 2 : ArrayList에 제너릭을 적용해주세요.
•
배열에는 제너릭 적용불가 ex. datas<T> = new T[3] 불가
code
문제 3 : 제너릭이 적용된 저장소 클래스를 만들어주세요.
code
3. HashMap과 제너릭
문제 1 : 해쉬맵 만들기 1
•
이 문제의 해쉬맵에서는 제너릭 사용불가->key가 일관된 하나의 타입으로 지정불가하므로
class Main {
public static void main(String[] args) {
HashMap aMap = new HashMap();
aMap.put(1, "안녕");
aMap.put("A", false);
}
}
class HashMap {
void put (Object key, Object data) {
}
Object get (Object key) {
return data;
}
}
Java
복사
문제 2 : 해쉬맵 만들기 2 (덮어쓰기 기능)
•
사용자함수 indexOfKey()이용 (indexOf () 로직과 유사한)
◦
put() 덮어쓰기 기능 추가→ (index == -1)이면 덮어쓰기
◦
get() 리팩토링→ (index==-1)이면 return null
code
문제 2 : 해쉬맵 만들기 3
•
keySet()
◦
entrySet() : key와 value 값이 모두 필요한 경우 vs keySet() : key 값만 필요한 경우
code
4. Interface
구상 클래스 | 추상 클래스 | 인터페이스 | |
추상성 | 0% | 0%~100% | 100% |
추상 메서드 개수 | 0개 | 0개~n개 | 모든 메서드가 추상메서드 여야 함 |
구상성 | 100% | 0%~100% | 0% |
구상 메서드 개수 | 모든 메서드가 구상메서드 여야 함(부모에게 추상메서드를 받은 경우 오버라이드 필수) | 0개 ~ n개 가능 | 0개 |
다른 클래스에 다형성 제공자로 쓰일 때 | extends | extends | implements |
객체화 가능여부(new 가능여부) | 가능 | 불가능 | 불가능 |
•
인터페이스는 다른 인터페이스들을 다중상속 할 수 있다.
•
인터페이스에는 private를 쓸 수 없다.
•
구상 클래스→new로 생성가능
•
추상클래스에도 추상 메서드는 최소화할 수록, 구상 메서드는 최대화할 수록 좋음
◦
구상성을 높여야 상속받은 자식 클래스들이 편함
abstract class 땡땡치킨 {
void 주문하다() {
String 내용 = 고객의_주문을_듣는다();
String 주소 = 고객의_주소를_듣는다();
전화를_끊는다();
주방에_주문을_토스한다(내용);
}
abstract String 고객의_주문을_듣는다();
abstract String 고객의_주소를_듣는다();
abstract void 전화를_끊는다();
abstract void 주방에_주문을_토스한다();
}
class 판교점_땡땡치킨 extends 땡땡치킨 { }
class 오목교점_땡땡치킨 extends 땡땡치킨 { }
Plain Text
복사
•
인터페이스는 그냥 추상성이 100%인 클래스와 같다 (단, 컴파일러가 다중상속을 허락하기 때문에 다중 상속해도 에러가 안나는)
•
인터페이스 내부 메서드에 abstract 꼭 안 붙여줘도 됨
•
인터페이스끼리 상속받을때에는 implements가 아닌 extends로 상속관계를 맺음(그러나! 바람직하지 않음)
•
인터페이스는 목적 자체가 다형성 구현을 위한 것이므로, 인터페이스에서 클래스 상속X 클래스에서 인터페이스 상속O
Q. 그럼 항상 인터페이스보다 추상클래스를 사용하는 것이 좋나요? 추상성 100%일 때만 인터페이스를 사용하면 되는 건가요?
A.강사님께서는 웬만하면 그렇게 하려고 하시나, 인터페이스를 쓰는 게 좋은 경우가 있음
추상클래스를 써야할 정도로 상위 클래스에 공통적인 기능이 있다면, 추상클래스를 사용하고 그 외에는 인터페이스 사용해주면 됨
클래스는 불가능하지만 인터페이스에서는 다중 상속이 가능한 이유?
자바에서 다중상속의 폐해는 무엇으로 막을 수 있나? 오버라이드로 막을 수 있다. 그러나 자바에서 일반 클래스는 오버라이딩이 필수가 아니다. 인터페이스(100%추상클래스)는 자식이 오버라이딩 해서 사용할 수밖에 없으므로 다중상속 가능.
번외 발표자료 (주제: static 멤버)
클래스 구성요소 → 멤버 (메소드, 필드)
1.메소드
2.필드(변수)
2-1. 멤버변수
a.
클래스 멤버변수(static variable): 객체 내부가 아닌 별도의 공간에 생성, 모든 객체가 공통적으로 똑같은 속성 가질 때
b.
인스턴스 멤버변수(instance variable): 객체 내부에 생성, 각 객체마다 개별적인 속성 가져야 할 때
2-2. 지역 변수(local variable)
*변수를 선언위치에 따라 크게 나누면 멤버 변수(클래스 영역)/지역 변수(메서드나 생성자 내부)
static 멤버
•
객체 밖에 static 멤버를 만들면 객체가 만들어지기 전에도 선언가능
•
객체끼리 static 멤버 공유 가능 (메모리 절약)
•
적용: 객체에 따라 달라지지 않는 메서드나 변수(≒클래스가 본사, 객체가 대리점이면 static 멤버는 본사 직원)
◦
대부분 static field는 상수를 선언할 때 많이 사용 (final static 으로 선언)
•
접근방법:
◦
클래스 이름을 통해서 접근
WiseSaying foundWiseSaying = WiseSayingService.findById(paramId);
→ findById가 무조건 static 멤버
(WiseSayingService 클래스 타입의 객체 생성 전에도 사용가능하므로)
◦
객체를 통해서 접근
WiseSaying foundWiseSaying = wiseSayingService.findById(paramId);
→ 이론적으로는 findById가 static 멤버여도 되고, 아니어도 됨
(그렇지만 findById 기능상 non-static 멤버인 것이 맞음)
staitc 멤버는 객체를 통해서 접근할 수도 있지만 첫번째 방법과 같이 Class를 통해서 접근하는 방법이 권장됨. 왜? 객체를 통해 접근하면 멤버 변수를 접근하고 있는지 static 변수를 접근하고 있는지 쉽게 구분이 안되기 때문
static 메서드의 제약 조건
•
static 메서드는 오직 static 멤버만 접근할 수 있다.
◦
이유? static 메서드는 객체가 생성되지 않은 상황에서도 사용이 가능하므로 객체에 속한 인스턴스 메소드, 인스턴스 변수 등을 사용불가
◦
그러나 인스턴스 메서드는 static 멤버들을 모두 사용 가능
non-static 멤버 vs static 멤버
non-static 멤버 | static 멤버 | |
공간적 특성 | 멤버는 객체마다 별도로 존재(=인스턴스 멤버) | 객체 내부가 아닌 별도의 공간에 생성(=클래스 멤버 변수) |
시간적 특성 | 객체 생성 시에 멤버 생성, 객체 사라지면 멤버도 사라짐 | 클래스 로딩 시에 멤버가 생성→객체가 생기기 전 생성 및 사용 가능, 프로그램 종료 시 사라짐 |
공유 특성 | 공유 X (객체 내 각각 생성되므로 각각의 공간 유지) | 공유 O (공유의 특성: 동일한 클래스의 모든 객체들에 의해 공유) |
static의 활용
•
전역 변수와 전역 함수를 만들 때 활용
◦
캡슐화 원칙(관련이 있는 변수와 함수를 하나의 클래스로 묶고 외부에서 쉽게 접근하지 못하도록)→자바에서는 C/C++와 달리 어떤 변수나 함수도 클래스 바깥에 존재할 수 없으며 클래스의 멤버로 존재하여야 함
◦
그러나 응용프로그램 작성 시 모든 클래스에서 공유하는 전역 변수나 모든 클래스에서 언제든지 호출할 수 있는 전역 함수를 만들어 사용할 필요가 생김
⇒static으로 해결 가능