[Become a Java-Masta๐จโ๐ซ 7์ฃผ์ฐจ] ์ ๋ ธํ ์ด์ , I/O, ์ ๋ค๋ฆญ, ๋๋ค์
๐ฏ ๋ชฉํ
์๋ฐ์ Annotation, I/O, Generic, Lambda์ ๋ํด ํ์ตํ๊ธฐ.
๐ ํ์ตํ ๊ฒ
Annotation
I/O
Generic
Lambda
Annotation
์ ๋
ธํ
์ด์
(Annotation)
: ์ฌ์ ์ ์๋ฏธ๋ก ์ฃผ์์ ์๋ฏธํ๋ฉฐ, ํ๋ก๊ทธ๋จ์ ๋ํ ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ๋ฉํ๋ฐ์ดํฐ์ ํ ํํ
์ ์ํ๋ ๋ฐฉ๋ฒ
์ ๋ ธํ ์ด์ ํ์ ์ java.lang or java.lang.annotation์์ ์ ๊ณตํด์ฃผ๋ ๊ฒ์ด ์๊ณ ํ์์๋ฐ๋ผ ์์ ์ด ์ง์ ์ ์ํด์ ์ฌ์ฉํ .
์ ๋
ธํ
์ด์
์ ์ง์ ์ ์ํ๋ ๋ฐฉ๋ฒ์ @interface
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ ์ํ๋ค.
public @interface CustomAnnotation {
// Element
int value();
}
@CustomAnnotation(value = 29)
@CustomAnnotation(29)
@interface
๋ ์ ๋
ธํ
์ด์
ํ์
(annotation type)์ ์ ์ธํ๋ ํค์๋์ด๊ณ , ์ ๋
ธํ
์ด์
ํ์
์ ์ธ์ ์ผ๋ฐ์ ์ธ ์ธํฐํ์ด์ค ์ ์ธ๊ณผ ๊ตฌ๋ถํ๊ธฐ ์ํด interface ์์ ๊ธฐํธ @๋ฅผ ๋ถ์ธ๋ค.
์ ๋ ธํ ์ด์ ์ Element๋ผ๋ ๊ฒ์ ๋ฉค๋ฒ๋ก ๊ฐ์ง ์ ์์ผ๋ฉฐ, Element๋ ํ์ ๊ณผ ์ด๋ฆ์ผ๋ก ๊ตฌ์ฑ๋๋ฉฐ default ๊ฐ์ ๊ฐ์ง ์ ์๋ค.
Element์ ์ด๋ฆ ๋ค์๋ ๋ฉ์๋๋ฅผ ์์ฑํ๋ ๊ฒ ์ฒ๋ผ ๋ค์ ()๋ฅผ ๋ถ์ฌ์ผ ํ๋ค.
์ ์๋ ์ ๋
ธํ
์ด์
์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ @์ ๋
ธํ
์ด์
๋ช
์ผ๋ก ์ ์ธํ ์ ์๊ณ , ํน์ ํด๋์ค๋ ๋ฉ์๋, ๋ณ์์ ๋ถ์ฌ ์ฌ์ฉํ๋ค.
๊ทธ๋ฆฌ๊ณ ํ ์ ์ธ๋ถ์ ์ฌ๋ฌ ์ ๋ ธํ ์ด์ ์ ์ฌ์ฉํ๋ ๊ฒ๋ ๊ฐ๋ฅํ๋ค.
๊ธฐ๋ณธ Element๋ value์ด๋ฉฐ, ํด๋นํ๋ ๊ฐ์ ์๋ตํ๊ณ ๋ฐ๋ก ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค.
์ ๋ ธํ ์ด์ ์ ์ฉ๋
์ปดํ์ผ ํ์
์ ์ ๊ณตํ๋ ์ ๋ณด@Override
: ์์ ํด๋์ค์ ๋ฉ์๋๋ฅผ ์ฌ์ ์ํ์์์ ๋ํ๋ด๋ Annotation. ์์ ํด๋์ค์ ํด๋น ๋ฉ์๋๊ฐ ์กด์ฌํ์ง ์๋ ๊ฒฝ์ฐ Compiler๊ฐ ๊ฒฝ๊ณ ํ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํจ.@SuppressWarnings
: ์ปดํ์ผ๋ฌ๊ฐ ๊ฒฝ๊ณ ํ๋ ๋ด์ฉ์ Ignore ํ ๋ ์ฌ์ฉํ๋ Annotation@Generated
: ์์ค ์ฝ๋๋ฅผ ์์ฑํ๋ ๋๊ตฌ์ ์ํด์ ํด๋น ์ฝ๋๊ฐ ์๋์ ์ผ๋ก ์์ฑ๋์์์ ๋ํ๋ด๋ Annotation
- ์ปดํ์ผ ์๊ฐ ๋ฐ ๋ฐฐํฌ ์๊ฐ ์ฒ๋ฆฌ -> ์ํํธ์จ์ด ๊ฐ๋ฐํด์ด ์ ๋
ธํ
์ด์
์ ๋ณด๋ฅผ ์ฒ๋ฆฌํ์ฌ ์ฝ๋, XML ํ์ผ๋ฑ์ ์์ฑ ๊ฐ๋ฅ (์ ๋
ธํ
์ด์
์ ์ฌ์ฉํ ๊ณณ์ ํน์ ์ฝ๋๋ฅผ ์ถ๊ฐ ex) Lombok์
@Getter
,@Setter
) - ๋ฐํ์ ์ฒ๋ฆฌ -> ์ผ๋ถ์ ๋
ธํ
์ด์
์ ๋ฐํ์์ ํน์ ๊ธฐ๋ฅ์ ์คํํ๋๋ก ์ ๋ณด๋ฅผ ์ ๊ณต (Java Reflection)
์๋ฐ ๋ฆฌํ๋ ์ (Java Reflection)
: ๊ตฌ์ฒด์ ์ธ ํด๋์ค ํ์ ์ ์์ง ๋ชปํด๋ ๋ฐํ์ ์์ ํด๋์ค ์ด๋ฆ๋ง ์๊ณ ์๋ค๋ฉด ๊ทธ ํด๋์ค์ ๋ฉ์๋, ํ์ , ๋ณ์๋ค์ ์ ๊ทผํ ์ ์๋๋ก ํด์ฃผ๋ ์๋ฐ API,@FunctionalInterface
: ํด๋น Interface๊ฐ ํ๋์ ๋ฉ์๋๋ง์ ์ ๊ณตํ๋ ํจ์ํ ์ธํฐํ์ด์ค์์ ๋ํ๋ด๋ Annotation@Deprecated
: ๋ ์ด์ ์ง์ํ์ง ์๋ ๊ธฐ๋ฅ์์ ์๋ ค์ฃผ๋ Annotation@SafeVarargs
: Generic๊ณผ ๊ฐ์ ๊ฐ๋ณ ์ธ์ Parameter๋ฅผ ์ฌ์ฉํ ๋ ๋ฐ์ํ๋ ๊ฒฝ๊ณ ๋ฅผ ignore ํ๋ Annotation@Repeatable
: ํด๋น Annotation์ ๋ฐ๋ณต์ ์ผ๋ก ์ฌ์ฉํ ์ ์๊ฒ ์ง์ํ๋ Annotation@Inherited
: Meta Annotation ์ค ํ๋๋ก ์จ ์ ์ฉ๋ ๋์ Annotation์ ํ์ Class, Interface์๊ฒ ์์์ํค๋ Annotation
@Retention
@Retention
์๋
ธํ
์ด์
์ ์ ๋
ธํ
์ด์
์ ์ธ์ ์ฌ์ฉ๋๋ ๋ฉํ ์ ๋
ธํ
์ด์
์ผ๋ก, ๋งํฌ๋ ์๋
ธํ
์ด์
์ ์ธ์ ๊น์ง ์ ์งํ ๊ฑด์ง ๊ฒฐ์ ํด์ฃผ๋ ์ ๋
ธํ
์ด์
์ด๋ค.
์ฆ, Java ์ปดํ์ผ๋ฌ๊ฐ ์ ๋ ธํ ์ด์ ์ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๊ธฐ์ ํ๋ฉฐ, ์ด๋ ์์ ๊น์ง ์ํฅ์ ๋ฏธ์น๋์ง ๊ฒฐ์ ํ๋ค.
๋ณด์กดํ ๊ธฐ๊ฐ์ ํน์ ํ๊ฒ ๋ช ์ํ์ง ์์ผ๋ฉด ๊ธฐ๋ณธ๊ฐ์ ํด๋์ค ํ์ผ๊น์ง ๋ณด์กดํ๋ค.
ํด๋น ์ ์ฑ
๋ค์ java.lang.annotation.RetentionPolicy
์ enum
์ผ๋ก ์ ์๋์ด ์์ผ๋ฉฐ ์๋์ ๊ฐ๋ค.
SOURCE
: ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผํ ๋ ํด๋น ์ ๋ ธํ ์ด์ ์ ์ธCLASS
: ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ์์๋ ํด๋น ์ ๋ ธํ ์ด์ ์ ๊ฐ์ ธ๊ฐ์ง๋ง ๋ฐํ์ ์์๋ ์ฌ๋ผ์งRUNTIME
: ๋ฐํ์์๋ ํด๋น ์ ๋ ธํ ์ด์ ์ ์ง
@Retention(RetentionPolicy.RUNTIME) //๋ฐํ์์๋ ํด๋น ์ ๋
ธํ
์ด์
์ ์ง
public @interface CustomAnnotation {
// Element
int value();
}
@Target
@Target
์ ๋
ธํ
์ด์
์ ์ ๋
ธํ
์ด์
์ ์ธ์ ์ฌ์ฉ๋๋ ๋ฉํ ์ ๋
ธํ
์ด์
์ผ๋ก, ์ ๋
ธํ
์ด์
์ ์ ์ฉํ ์ ์๋ ๋ฒ์๋ฅผ ์ ์ํ๋ค.
ํด๋น ๋ฒ์๋ค์ java.lang.annotation.ElementType
์ ๋ค์ํ ๋ฒ์๊ฐ ์ ์๋์ด ์์ผ๋ฉฐ ์๋์ ๊ฐ๋ค.
TYPE
: Class, Interface ๋ฑ์ Level์ ์ ์ธ ๊ฐ๋ฅMETHOD
: ๋ฉ์๋์ ์ ์ธ ๊ฐ๋ฅFIELD
: Enum, ์์, Field ๋ณ์์ ๋ํด ์ ์ธ ๊ฐ๋ฅPARAMETER
: ๋งค๊ฐ๋ณ์์ ์ ์ธ ๊ฐ๋ฅCONTRUCTOR
: ์์ฑ์ Type์ ์ ์ธ ๊ฐ๋ฅLOCAL_VARIABLE
: ์ง์ญ ๋ณ์์ ๋ํด ์ ์ธ ๊ฐ๋ฅANNOTATION_TYPE
: Annotation์ ์ ์ธ ๊ฐ๋ฅPACKAGE
: ํจํค์ง์ ์ ์ธ ๊ฐ๋ฅ
@Target(ElementType.FIELD) // Enum, ์์, Field ๋ณ์์ ๋ํด ์ ์ธ ๊ฐ๋ฅ
@Retention(RetentionPolicy.RUNTIME) // ๋ฐํ์์๋ ํด๋น ์ ๋
ธํ
์ด์
์ ์ง
public @interface CustomAnnotation {
// Element
int value();
}
@Documented
@Documented
์ ๋
ธํ
์ด์
์ ์ ๋
ธํ
์ด์
์ ์ธ์ ์ฌ์ฉ๋๋ ๋ฉํ ์ ๋
ธํ
์ด์
์ผ๋ก, ํด๋น ์ ๋
ธํ
์ด์
์ ๋ํ ์ ๋ณด๋ฅผ Javadoc๋ฌธ์์ ํฌํจํ๋ค๋ ๊ฒ์ ์ ์ธํ๋ค.
@Documented // ์ด ์ ๋
ธํ
์ด์
์ ๋ํ ์ ๋ณด๋ฅผ Javadoc๋ฌธ์์
@Target(ElementType.FIELD) // Enum, ์์, Field ๋ณ์์ ๋ํด ์ ์ธ ๊ฐ๋ฅ
@Retention(RetentionPolicy.RUNTIME) // ๋ฐํ์์๋ ํด๋น ์ ๋
ธํ
์ด์
์ ์ง
public @interface CustomAnnotation {
// Element
int value();
}
Annotation Processor
Annotation Processor
๋ ์ ๋
ธํ
์ด์
์ ์ด์ฉํ์ฌ ํ๋ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํ๋ ๊ฒ์ ์๋ฏธํ๋ฉฐ, ์ปดํ์ผ๋ฌ๊ฐ ์ปดํ์ผ ์ค์ ์๋ก์ด ์์ค์ฝ๋๋ฅผ ์์ฑํ๊ฑฐ๋ ๊ธฐ์กด์ ์ฝ๋ ๋ณ๊ฒฝ์ ๊ฐ๋ฅํ๊ฒ ํ๋ค.
ํนํ ์ปดํ์ผ ๋จ๊ณ์์ ์ ๋ ธํ ์ด์ ์ ์ ์๋ ์ก์ ์ ์ฒ๋ฆฌํ๋๋ฐ, ์ด๊ฒ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์คํ๋๊ธฐ ์ ์ปดํ์ผ ํ์์ ๋ฏธ๋ฆฌ ์ฒดํฌ๋ฅผ ํด์ฃผ๊ธฐ ๋๋ฌธ์ ์ ๋ ธํ ์ด์ ์ด ์๋ํ๋๋ก ์ด๋ฃจ์ด์ง์ง ์์ผ๋ฉด ๋์ผ๋ก ํ์ธํ ์ ์๋ ์๋ฌ๋ ๊ฒฝ๊ณ ๋ฅผ ๋ณด์ฌ์ค๋ค.
์ ๋
ธํ
์ด์
ํ๋ก์ธ์์ ๊ฐ์ฅ ๋ํ์ ์ธ ์๋ก๋ Lombok
๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์๋ค.
Getter, Setter์ ๊ฐ์ด ๋ฐ๋ณต์ ์ด๊ณ ์ค๋ณต๋๋ ๋ง์ ์ฝ๋๋ฅผ ์์ฐํ๋ ์ฝ๋(boilerplate code)๋ฅผ ์ต์ํํ๊ณ ํต์ฌ์ ์ธ ๊ธฐ๋ฅ์ ๋ช ํํ๊ฒ ํ์ธํ ์ ์๋๋ก ํ๋ค.
์ ๋
ธํ
์ด์
ํ๋ก์ธ์๋ฅผ ์์ฑํ๊ณ ๋ฑ๋กํ๊ธฐ ์ํด์๋ AbstractProcessror
ํด๋์ค๋ฅผ ์์๋ฐ์์ผ ํ๋๋ฐ, Lombok
๋ํ AbstractProcessor
๋ฅผ ์์๋ฐ์ ์ ๋
ธํ
์ด์
ํ๋ก์ธ์๋ฅผ ์ ์ํ ๊ฒ์ด๋ค.
Lombok
- @Getter @Setter @Builder
AutoService
:- java.util.ServiceLoader ์ฉ ํ์ผ ์์ฑ ์ ํธ๋ฆฌํฐ
- ๋ฆฌ์์ค ํ์ผ์ ๋ง๋ค์ด ์ค.
- META-INF ๋ฐ์ service ๋ฐ์ ServiceLoader์ฉ ๋ ์ง์คํธ๋ฆฌ ํ์ผ์ ๋ง๋ค์ด ์ค.
@Override
- ์ปดํ์ผ๋ฌ๊ฐ ์ค๋ฒ๋ผ์ด๋ฉํ๋ ๋ฉ์๋๊ฐ ์๋ชป๋ ๋์์์ ์ฒดํฌํด์ฃผ๋ ๊ฒ๋ ์ ๋ ธํ ์ด์ ํ๋ก์ธ์์
Dagger2
- ์ปดํ์ผ ํ์ DI ์ ๊ณต -> ๋ฐํ์ ๋น์ฉ์ด ์์ด์ง.
์๋๋ก์ด๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- ButterKnife : @BindView (๋ทฐ ์์ด๋์ ์ ๋ ธํ ์ด์ ๋ถ์ธ ํ๋ ๋ฐ์ธ๋ฉ)
- DeepLinkDispatcher : ํน์ URI ๋งํฌ๋ฅผ Activity๋ก ์ฐ๊ฒฐํ ๋ ์ฌ์ฉ
I/O
I/O
๋ Input(์
๋ ฅ) and Output(์ถ๋ ฅ)์ ์ฝ์์ด๋ค.
I/O์ ๊ฐ๋จํ ์์๋, ํค๋ณด๋๋ก ํ ์คํธ๋ฅผ ์ ๋ ฅํ๊ณ ๋ชจ๋ํฐ๋ก ์ ๋ ฅํ ํ ์คํธ๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ด๋ค.
๊ธฐ์กด์ IO(I/O)
๋ฐฉ์์ ์คํธ๋ฆผ ๋ฐฉ์์ ์
์ถ๋ ฅ์ธ๋ฐ, ์ด ๋ฐฉ์์ผ๋ก๋ ๋คํธ์ํฌ์์์ ์ด๋ฃจ์ด์ง๋ ์
์ถ๋ ฅ์ ์๋๊ฐ ํ๋์จ์ด์์ ์ด๋ฃจ์ด์ง๋ ์
์ถ๋ ฅ ์๋์ ๋นํด ํ์ ํ ๋๋ฆฌ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ์ ์ด ์๊ฒผ๋ค.
๋ํ ์คํธ๋ฆผ ๋ฐฉ์์ ๋ณ๋ชฉํ์์ ๋งค์ฐ ์ทจ์ฝํ๋ค๋ ๋จ์ ์ด ์๊ณ ๋คํธ์ํฌ์ ๋ฐ์ ๋ณด๋ค ํ๋์จ์ด์ ๋ฐ์ ์๋๊ฐ ์์๋๊ฐ๋ฉด์ ์๋ก์ด I/O ๋ฐฉ์์ด ํ์ํด์ก๋ค.
๊ทธ๋์ ์ด๋ฌํ ๋คํธ์ํฌ ํ๊ฒฝ์์์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํด์ NIO(NEW I/O)
๋ฐฉ์์ด ๋ํ๋ฌ๋ค.
๊ตฌ๋ถ | IO | NIO |
---|---|---|
์ ์ถ๋ ฅ | ์คํธ๋ฆผ | ์ฑ๋ |
๋ฒํผ | non-๋ฒํผ | ๋ฒํผ |
๋น๋๊ธฐ | ์ง์ ์ํจ | ์ง์ |
๋ธ๋กํน | ๋ธ๋กํน๋ง ์ง์ | ๋ธ๋กํน / non-๋ธ๋กํน ๋ชจ๋ ์ง์ |
Stream
Stream์ด๋, ํ ๋ฐฉํฅ์ผ๋ก ์ฐ์์ ์ผ๋ก ํ๋ฌ๊ฐ๋ ๊ฒ์ ์๋ฏธํ๋ค.
์ด Stream์ด ํ๋ก๊ทธ๋๋ฐ์์๋ ๋ฐ์ดํฐ๊ฐ ํ ๋ฐฉํฅ์ผ๋ก ํ๋ฌ๊ฐ ์ ์๋๋ก ๋์์ฃผ๋ ๊ด, ํต๋ก๋ผ๋ ์๋ฏธ๋ก ์ฌ์ฉ๋๋ค.
์
์ถ๋ ฅ ๋
ธ๋์ ์ง์ ์ฐ๊ฒฐ๋๋ Stream์ ๋
ธ๋์คํธ๋ฆผ
์ด๋ผ๊ณ ํ๊ณ , ์ด๋ ํ์ ๋ค.
๊ทธ๋ฆฌ๊ณ ๋ค๋ฅธ ์คํธ๋ฆผ์ ๋ณด์กฐํ๋ ๊ธฐ๋ฅ์ ์ธ Stream์ ํํฐ์คํธ๋ฆผ
์ด๋ผ๊ณ ํ๋ฉฐ, ์ด๋ ์ต์
์ด๋ค.
๋ฐ์ฝ๋ ์ดํฐ ํจํด
์ผ๋ก ๋
ธ๋์คํธ๋ฆผ
์ ํํฐ์คํธ๋ฆผ
์ด ์ถ๊ฐ๋๋ ๋ฐฉ์์ด๋ค.
Stream์ด ๋ฐ์ดํฐ๋ฅผ ์ด๋ค ๋ฐฉ์์ผ๋ก ์ ๋ฌํ๋๋์ ๋ฐ๋ผ 2๊ฐ์ง๋ก ๊ตฌ๋ถํ ์ ์๋ค.
Byte Stream
(๋ฐ์ดํธ ์คํธ๋ฆผ)- ๋ฐ์ดํฐ๋ฅผ Byte ๋จ์๋ก ์ฃผ๊ณ ๋ฐ์
- Binary ๋ฐ์ดํฐ๋ฅผ ์ ์ถ๋ ฅํ๋ ์คํธ๋ฆผ
- ๋ชจ๋ ์ข ๋ฅ์ ๋ฐ์ดํฐ ๋ฅผ ์ฃผ๊ณ ๋ฐ์ ์ ์์
InputStream
๊ณผOutputStream
ํด๋์ค๋ฅผ ์์๋ฐ์ ์ฌ์ฉ
FileInputStream
/FileOutputStream
: ํ์ผ ์ ์ถ๋ ฅ ์คํธ๋ฆผByteArrayInputStream
/ByteArrayOutputStream
: ๋ฉ๋ชจ๋ฆฌ ์ ์ถ๋ ฅ ์คํธ๋ฆผPipedInputStream
/PipedOutputStream
: ํ๋ก์ธ์ค ์ ์ถ๋ ฅ ์คํธ๋ฆผAudioInputStream
/AudioOutputStream
: ์ค๋์ค ์ฅ์น ์ ์ถ๋ ฅ ์คํธ๋ฆผ
์๋ฐ์์ ๊ฐ์ฅ ์์ ํ์
์ธ char ํ์ด 2๋ฐ์ดํธ์ด๋ฏ๋ก, 1๋ฐ์ดํธ์ฉ ์ ์ก๋๋ ๋ฐ์ดํธ ๊ธฐ๋ฐ ์คํธ๋ฆผ์ผ๋ก๋ ์ํํ ์ฒ๋ฆฌ๊ฐ ํ๋ ๊ฒฝ์ฐ๊ฐ ์๋ค. ์ด๋ฌํ ๊ฒฝ์ฐ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์๋ฐ๋ Character Stream
์ ์ง์ํจ
Character Stream
(๋ฌธ์ ์คํธ๋ฆผ)- ๋ฐ์ดํฐ๋ฅผ Character ๋จ์๋ก ์ฃผ๊ณ ๋ฐ์
- ๋ฌธ์ ๋ฐ์ดํฐ๋ฅผ ์ธ์ฝ๋ฉ ์ฒ๋ฆฌํ์ฌ ์ ์ถ๋ ฅํ๋ ์คํธ๋ฆผ
- ์ค์ง ๋ฌธ์ ๋ฐ์ดํฐ ๋ง ์ฃผ๊ณ ๋ฐ์ ์ ์์
Reader
์Writer
ํด๋์ค๋ฅผ ์์๋ฐ์ ์ฌ์ฉ
FileReader
/FileWriter
: ํ์ผ ์ ์ถ๋ ฅ ์คํธ๋ฆผCharArrayReader
/CharArrayWriter
: ๋ฉ๋ชจ๋ฆฌ ์ ์ถ๋ ฅ ์คํธ๋ฆผPipedReader
/PipedWriter
: ํ๋ก์ธ์ค ์ ์ถ๋ ฅ ์คํธ๋ฆผStringReader
/StringWriter
: ๋ฌธ์์ด ์ ์ถ๋ ฅ ์คํธ๋ฆผ
๋ Stream์ ๋ชจ๋ ์ฒ์์๋ byte๋ก ๋ฐ์๋ค์ด๊ณ , ๊ทธ ๋ค์์ ๊ฐ Stream์ด ์์์ ์ฒ๋ฆฌ๋ฅผ ํด์ค๋ค.
ํ์ค Stream
System
Class๋ ์๋ฐ์์ ๋ฏธ๋ฆฌ ์ ์ํด๋ ํ์ค ์
์ถ๋ ฅ ํด๋์ค์ด๋ฉฐ, java.lang
ํจํค์ง์ ํฌํจ๋์ด ์๋ค.
System.in
: ํ์ค ์ ๋ ฅ ์คํธ๋ฆผSystem.out
: ํ์ค ์ถ๋ ฅ ์คํธ๋ฆผSystem.err
: ํ์ค ์๋ฌ ์ถ๋ ฅ ์คํธ๋ฆผ
Channel
์๋ฒ์ ํด๋ผ์ด์ธํธ๊ฐ์ ํต์ ์๋จ
์ ์๋ฏธํ๋ค.
์ผ๋ฐ์ ์ผ๋ก NIO(new I/O)์ ๋ชจ๋ I/O๋ ์ฑ๋๋ก ์์ํ๋ค.
์ฑ๋์ ์คํธ๋ฆผ๊ณผ ์ ์ฌํ์ง๋ง ๋ช ๊ฐ์ง ์ฐจ์ด์ ์ด ์กด์ฌํ๋ค.
- ๋น๋๊ธฐ์ ์ ์ถ๋ ฅ
์คํธ๋ฆผ
์ ๋จ๋ฐฉํฅ ์ ์ถ๋ ฅ(์ฝ๊ธฐ ๋๋ ์ฐ๊ธฐ) ๋ง ๊ฐ๋ฅํ์ง๋ง์ฑ๋
์ ํตํด์๋ ์๋ฐฉํฅ ์ ์ถ๋ ฅ(์ฝ๊ณ ์ฐ๊ธฐ) ์ด ๊ฐ๋ฅํ๋ค ์๋ค.- ํญ์
๋ฒํผ
๋ฅผ ์ด์ฉํ์ฌ ์ ์ถ๋ ฅ์ ํ๋ค.
Buffer
๋ฐ์ดํฐ๋ฅผ ์์ ์ ์ฅํ๋ ๊ณต๊ฐ์ ์๋ฏธํ๋ค.
IO
์์๋ ์ถ๋ ฅ ์คํธ๋ฆผ์ด 1๋ฐ์ดํธ๋ฅผ ์ฐ๋ฉด ์
๋ ฅ ์คํธ๋ฆผ์ด 1๋ฐ์ดํธ๋ฅผ ์ฝ๋๋ค.
NIO
์์ ๋ฒํผ๋ ์ฑ๋๊ณผ ์ํธ์์ฉํ ๋ ์ฌ์ฉ๋๋ค. ์ปค๋์ ์ํด ๊ด๋ฆฌ๋๋ ์์คํ
๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ์ฌ์ฉํ ์ ์๋ ์ฑ๋์ ์ ํด ์ง์ read ๋๊ฑฐ๋ write ๋ ์ ์๋ ๋ฐฐ์ด๊ณผ ๊ฐ์ ๊ฐ์ฒด์ด๋ค.
์ ์ถ๋ ฅ์ ๋ด๋นํ๋ ์ฅ์น, ํ๋ก์ธ์ค์์ ๊ณ ์ ์ฅ์น(ํ๋ก์ธ์ค)๊ฐ ์ ์ ์ฅ์น(ํ๋ก์ธ์ค)๊ฐ ์์ ์ ํ๋ ๋์ ๊ธฐ๋ค๋ฆฌ๋ ์๊ฐ์ ์ค์ฌ ๊ฐ๋ณ ์์ ๋ค ๊ฐ์ ํ๋์ ์ํํ๊ฒ ์ง์ํ๊ธฐ ์ํด ์กด์ฌํ๋ค.
๋ฐ๋ผ์, 1๋ฐ์ดํธ์ฉ ์ ๋ฌ์ด ์๋๋ผ ๊ธฐ๋ค๋ฆฌ๋ ๋์ ๋ฒํผ์ ๋ฐ์ดํฐ๋ฅผ ์ถ์ฒํ์ฌ ํ๋ฒ์ ์ ๋ฌํ์ฌ ๋น ๋ฅธ ์๋๋ฅผ ๋ณด์ธ๋ค.
InputStream
Byte Stream
๊ธฐ๋ฐ์ ์
๋ ฅ ์คํธ๋ฆผ์ ์ต์์ ํด๋์ค(์ถ์ํด๋์ค)๋ก์จ ๋ชจ๋ Byte๊ธฐ๋ฐ ์
๋ ฅ ์คํธ๋ฆผ์ ์ด ํด๋์ค๋ฅผ ์์๋ฐ๊ณ ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ผ๋ก ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์คํธ๋ฆผ์ด ๋ง๋ค์ด์ง๋ค.
InputStream
ํด๋์ค์๋ ์
๋ ฅ์ ์ํด ํ์ํ ๊ธฐ๋ณธ์ ์ธ ๋ฉ์๋๋ค์ด ์ ์๋์ด ์๋ค.
int available()
: ํ์ฌ ์ฝ์ ์ ์๋ byte์๋ฅผ ๋ฆฌํดabstract int read()
: InputStream์ผ๋ก๋ถํฐ 1byte๋ฅผ ์ฝ๊ณ ๋ฆฌํด.int read(byte[] b)
: InputStream์ผ๋ก๋ถํฐ ์ฝ์ ๋ฐ์ดํธ๋ค์ byte[] b์ ์ ์ฅํ๊ณ ์ฝ์ ๋ฐ์ดํธ ์๋ฅผ ๋ฆฌํด.int read(byte[] b, int off, int len)
: InputStream์ผ๋ก๋ถํฐ len byte๋งํผ ์ฝ์ด byte[] b์ b[ off ] ๋ถํฐ len ๊ฐ๊น์ง ์ ์ฅํ ํ ์ฝ์ byte ์์ธ len ๊ฐ๋ฅผ ๋ฆฌํด. ๋ง์ฝ len ๊ฐ๋ณด๋ค ์ ์ byte๋ฅผ ์ฝ๋ ๊ฒฝ์ฐ ์ค์ ์ฝ์ byte์๋ฅผ ๋ฆฌํดvoid close()
: ์ฌ์ฉํ ์์คํ ๋ฆฌ์์ค๋ฅผ ๋ฐ๋ฉ ํ ์ ๋ ฅ ์คํธ๋ฆผ์ ๋ซ๋ ๋ฉ์๋.close() : ์ฌ์ฉํ ์์คํ ๋ฆฌ์์ค๋ฅผ ๋ฐ๋ฉ ํ InputStream์ ๋ซ์.
OutputStream
OutputStream ๋ํ Byte Stream
๊ธฐ๋ฐ์ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ต์์ ํด๋์ค(์ถ์ํด๋์ค)๋ก์จ ๋ชจ๋ Byte๊ธฐ๋ฐ ์ถ๋ ฅ ์คํธ๋ฆผ์ ์ด ํด๋์ค๋ฅผ ์์๋ฐ๊ณ ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ผ๋ก ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ฐฉ์์ผ๋ก ์คํธ๋ฆผ์ด ๋ง๋ค์ด์ง๋ค.
OutputStream
ํด๋์ค์๋ ์ถ๋ ฅ์ ์ํด ํ์ํ ๊ธฐ๋ณธ์ ์ธ ๋ฉ์๋๋ค์ด ์ ์๋์ด ์๋ค.
void flush()
: ๋ฒํผ์ ๋จ์์๋ OutputStream์์ ์ถ๋ ฅabstract void write(int b)
: ์ ์ b์ ํ์ 1byte๋ฅผ ์ถ๋ ฅvoid write(byte[] b)
: ๋ฒํผ์ ๋ด์ฉ์ ์ถ๋ ฅvoid write(byte[] b, int off, int len)
: b ๋ฐฐ์ด ์์ ์์์ off ๋ถํฐ len ๋งํผ ์ถ๋ ฅvoid close()
: ์ฌ์ฉํ ์์คํ ๋ฆฌ์์ค๋ฅผ ๋ฐ๋ฉ ํ OutputStream์ ๋ซ์.
ํ์ผ ์ฝ๊ณ ์ฐ๊ธฐ
์๋ฐ์ ๋ด์ฅ ํด๋์ค์ธ FileReader
, FileWriter
, BufferedReader
, BufferedWriter
๋ฅผ ์ฌ์ฉํ์ฌ ํ์ผ์ ์ฝ๊ณ ์ธ ์ ์๋ค.
File file = new File(PATH);
FileWriter fw = new FileWriter(file);
FileReader fr = new FileReader(file);
BufferedWriter bw = new BufferedWriter(fw);
BufferedReader br = new BufferedReader(fr);
FileReader
, FileWriter
์ BufferedReader
, BufferedWriter
๋ ๋ฐ์ฝ๋ ์ดํฐ ํจํด์ด ์ ์ฉ๋จ์ ์ ์ ์๋ค.
Generic
Java 5
๋ถํฐ ์ถ๊ฐ๋์ด ํด๋์ค์ ์ธํฐํ์ด์ค, ๋ฉ์๋๋ฅผ ์ ์ํ ๋ ํ์
๋ณ์
๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ํ๋ ๋ฐฉ๋ฒ์ด๋ค.
ํ์ ๋ณ์
: ์ผ๋ฐ์ ์ผ๋ก ๋๋ฌธ์ ์ํ๋ฒณ ํ ๊ธ์๋ก ํํํ๋ค.<T>
: Type<E>
: Element<K>
: Key<N>
: Number<V>
: Value<R>
: Return
์ปดํ์ผ ์์ ๊ฐ์ฒด์ ํ์ ์ ์ฒดํฌ๋ฅผ ํด์ฃผ๋ ๊ธฐ๋ฅ์ ์ ๊ณตํจ์ผ๋ก์จ ์์ ์ฑ์ ๋์ด๊ณ ํ๋ณํ์ ๋ฒ๊ฑฐ๋ก์์ ์ค์ฌ์ค๋ค.
Collection
๋ผ์ด๋ธ๋ฌ๋ฆฌ์์ ํํ Generic
์ด ํ์ฉ๋๋ค.
//List<T>
List<Integer> listG = new ArrayList<>(); // ์ ๋ค๋ฆญ
listG.add(1);
int temp = listG.get(0);
List listNG = new ArrayList(); // ์ ๋ค๋ฆญ ์ฌ์ฉ X
listNG.add(1);
temp = (int)listNG.get(0); // ํ๋ณํ ํ์
Generic์ Generic ํ์
๊ณผ Generic ๋ฉ์๋
๋ก ๊ตฌ๋ถํ ์ ์๋ค.
Generic ํ์
ํ์ ๋ณ์๊ฐ ์๋ ํด๋์ค ๋๋ ์ธํฐํ์ด์ค
class GenericClass<T> {
...
}
interface GenericInterface<T> {
...
}
Generic ๋ฉ์๋
๋งค๊ฐ ํ์ ๊ณผ ๋ฆฌํด ํ์ ์ผ๋ก ํ์ ๋ณ์๋ฅผ ๊ฐ๋ ๋ฉ์๋
public <T, R> R genericMethod(T t) { }
์ ๋ค๋ฆญ์ ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ
-
์ ๋ค๋ฆญ ํ์ ์ ๋ฐฐ์ด์ ์์ฑํ ๊ฒฝ์ฐ : new T[N]์ ์ปดํ์ผ ํ์์ ๋ฐฐ์ด์ ํ์ ์ ์ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค.
-
static ๋ณ์์ ์ฌ์ฉํ ๊ฒฝ์ฐ : static ๋ณ์๋ ์ธ์คํด์ค์ ์ข ์๋์ง ์์ผ๋ฏ๋ก ์ธ์คํด์ค๋ณ ํ์ ์ด ๋ณ๊ฒฝ๋ ์ ์๊ธฐ ๋๋ฌธ์ ์ฌ์ฉํ ์ ์๋ค. (๋จ, static ๋ฉ์๋์๋ ์ ๋ค๋ฆญ ์ฌ์ฉ ๊ฐ๋ฅ)
Generic์ ์ฃผ์ ๊ฐ๋
์ผ๋ก๋ Bounded-Type
๊ณผ Wild-Card
๊ฐ ์๋ค.
BoundedType
Bounded-Type
์ ์ ๋ค๋ฆญ์ผ๋ก ์ฌ์ฉ๋ ํ์
๋ณ์์ ๋ฒ์๋ฅผ ์ ํํ๋ ๊ฒ์ด๋ค.
Generic ํ์
์ extends
๋ฅผ ์ฌ์ฉํ์ฌ ํ์
๋ณ์์ ๋ฒ์๋ฅผ ์ ํํ๋ค. (์ธํฐํ์ด์ค, ํด๋์ค ๋ชจ๋ ์๊ด์์ด extends
๋ฅผ ์ฌ์ฉ)
public class CustomGeneric<T extends Number> {
...
}
CustomGeneric<Integer> listI = new CustomGeneric<();
CustomGeneric<String> listS = new CustomGeneric<>(); // Bounded-Type์ผ๋ก ํ์
๋ณ์๋ฅผ Number๋ก ์ ํํ๊ธฐ ๋๋ฌธ์ ์ปดํ์ผ ์๋ฌ ๋ฐ์!
public class CustomGeneric<T extends ClassName & InterfaceName> { // & ๊ธฐํธ๋ฅผ ์ฌ์ฉํ์ฌ ํ์
๋ณ์๋ฅผ ํด๋์ค์ ์ธํฐํ์ด์ค 2๊ฐ๋ก ์ ํ ๊ฐ๋ฅ
...
}
WildCard
์ ๋ค๋ฆญ ํ์ ์ ๋ฉ์๋์ ๋งค๊ฐ๊ฐ์ผ๋ก ์ ๋ฌํ ๋ ๊ตฌ์ฒด์ ์ธ ํ์ ์ผ๋ก๋ง ํ์ ์ ํ์ด ์๊ธด๋ค ๊ทธ๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์์ผ๋ ์นด๋๋ฅผ ์ฌ์ฉํ๋ค.
?
ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ์์ผ๋ ์นด๋๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
์ ๋ค๋ฆญ ํ์ <?>
: ์ ํ ์์. ๋ชจ๋ ํด๋์ค๋ ์ธํฐํ์ด์ค ๊ฐ๋ฅ์ ๋ค๋ฆญ ํ์ <? extends ์์ ํ์ >
: ํ์ ์ ์ํ์ ์ง์ (ํด๋น ํ์ ๋ฐ ํ์ํ์ ๋ง, ์ต์์ด ์ ์ํ ํ์ ), ์ต๋ ์ ์๋ ์์ ํ์ ๋ณด๋ค ๋ ์์ ํ์ ์ ์ฌ์ฉํ ์ ์์์ ๋ค๋ฆญ ํ์ <? super ํ์ ํ์ >
: ํ์ ์ ํํ์ ์ง์ (ํด๋น ํ์ ๋ฐ ์์ํ์ ๋ง, ์ตํ๊ฐ ์ ์ํ ํ์ ), ์ต์ ์ ์๋ ํ์ ํ์ ๋ณด๋ค ๋ ํ์ ํ์ ์ ์ฌ์ฉํ ์ ์์
Erasure
์ ๋ค๋ฆญ์ ํ์ ์๊ฑฐ(Generics Type Erasure)
: ์ปดํ์ผ๋ฌ๋ ์ ๋ค๋ฆญ ํ์ ์ ์ด์ฉํด ์์คํ์ผ์ ๊ฒ์ฌํ๊ณ ๋ฐํ์์๋ ํด๋น ํ์ ์ ์ ๋ณด๋ฅผ ์ ์ ์๋ค๋ ๊ฐ๋ ์ด๋ค. ์ฆ, ์ปดํ์ผ๋ ํ์ผ*.class
์๋ ์ ๋ค๋ฆญ ํ์ ์ ๋ํ ์ ๋ณด๊ฐ ์๋ค๋ ๋ป.
Erasure ๊ท์น
UnBounded-Type
์ Object- ex)
(<?>, <T>)
=> Object
- ex)
Bounded-Type
์ extends ๋ค์ ์์ฑํ ๊ฐ์ฒด- ex)
<T extends Number>
=> Number
- ex)
Lambda
๋๋ค์(Lambda expression)์ ๋ฉ์๋๋ฅผ ๊ฐ๋จํ๋ฉด์ ๋ช
ํํ ์(expression)
์ผ๋ก ํํํ ๊ฒ์ด๋ค.
๋๋ค์์ ์ธํด ์ด๋ฆ๊ณผ ๋ฆฌํดํ์
์ด ํ์์์ด, ์ต๋ช
ํจ์(anonymous function)
๋ผ๊ณ ๋ ํ๋ค.
๋๋ค์์ ๋ฉ์๋์ ๋๋ฑํ ๊ฒ์ฒ๋ผ ๋ณด์ด์ง๋ง, ์ฌ์ค ๋๋ค์์ ์ต๋ช ํด๋์ค์ ๊ฐ์ฒด์ ๋๋ฑํ์ฌ ๋ฐํ์ ์์ ์ธํฐํ์ด์ค์ ์ต๋ช ๊ตฌํ ๊ฐ์ฒด๋ก ์์ฑ๋๊ณ ๋์ ๋๋ ์ธํฐํ์ด์ค์ ๋ฐ๋ผ ๊ตฌํ ์ธํฐํ์ด์ค๊ฐ ๊ฒฐ์ ๋๋ค.
Lambda์ ๋์ ์ผ๋ก ์ธํด ์๋ฐ๋ ๊ฐ์ฒด ์งํฅ ์ธ์ด์ธ ๋์์ ํจ์ํ ์ธ์ด๊ฐ ๋์๋ค.
Lambda ์ฌ์ฉ๋ฒ
๋ฉ์๋์์ ๋ฉ์๋์ด๋ฆ๊ณผ ๋ฆฌํดํ์
์ ์ ๊ฑฐํ๊ณ ๋งค๊ฐ๋ณ์
{์คํ์ฝ๋}
์ฌ์ด์ ->
ํ์ดํ๋ฅผ ์ถ๊ฐํ์ฌ
๋งค๊ฐ๋ณ์
-> {์คํ์ฝ๋}
๋ก ๋๋ค์์ ์ฌ์ฉํ ์ ์๋ค.
๋ฉ์๋๋ฅผ ์ ์ธ ํ ๋๋ ๋์ ์ธ๋ฏธ์ฝ๋ก ;
์ ๋ถ์ด์ง ์๋ฏ์ด, ๋๋ค์ ๋ํ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ๋ฏธ์ฝ๋ก ;
์ ๋ถ์ด์ง ์๋๋ค
// ๋ฉ์๋
๋ฆฌํดํ์
๋ฉ์๋์ด๋ฆ (๋งค๊ฐ๋ณ์ํ์
๋งค๊ฐ๋ณ์) {
์คํ์ฝ๋
}
// ๋๋ค์
((๋งค๊ฐ๋ณ์) -> {์คํ์ฝ๋})
// ๋งค๊ฐ๋ณ์ :
// ๋งค๊ฐ๋ณ์๊ฐ ํ๋์ผ ๋๋ ()๋ฅผ ์๋ตํ ์ ์๋ค.
// ๋จ, ๋งค๊ฐ๋ณ์ ํ์
์ด ์์ผ๋ฉด(๋๋ถ๋ถ์ ๋งค๊ฐ๋ณ์ ํ์
์ ์ถ๋ก ์ด ๊ฐ๋ฅํด์ ์๋ต ๊ฐ๋ฅ) ()๋ฅผ ์๋ตํ ์ ์๋ค.
// ์ฝ๋ :
// ์คํ์ฝ๋๊ฐ ํ๋์ผ ๋๋ {}๋ฅผ ์๋ตํ ์ ์๋ค.
// ๋จ, {} ์์ ์คํ์ฝ๋์ return ํค์๋๊ฐ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ {}๋ฅผ ์๋ตํ ์ ์๋ค.
// ๋ฉ์๋
int max(int a, int b) {
return a > b ? a : b;
}
// ๋๋ค์
((a, b) -> a > b ? a : b) // ๋งค๊ฐ๋ณ์๊ฐ a์ b 2๊ฐ์ด๋ฏ๋ก () ์๋ต ๋ถ๊ฐ. ๊ทธ๋ฆฌ๊ณ return ํค์๋๊ฐ ์ฌ์ฉ๋์ง ์์ผ๋ฏ๋ก {} ์๋ต ๊ฐ๋ฅ
List๋ฅผ ๋๋ค์์ผ๋ก ์กฐ์ํ๋ ๊ฐ๋จํ ์์๋ฅผ ์ดํด๋ณด์.
ArrayList<Integer> list = new ArrayList<Integer>();
for(int i=1; i<=10; ++i) list.add(i);
list.replaceAll(e -> e+10); // ๋ชจ๋ ์์์ 10์ฉ ๋ํ๊ธฐ
list.removeIf(e -> e%2==1); // ํ์๊ฐ ์์ ์์ ๊ธฐ
list.forEach(e -> System.out.println(e)); // ๋ชจ๋ ์์ ์ถ๋ ฅ
๊ทธ๋ฆฌ๊ณ PS๋ฅผ ํ๋ค๋ณด๋ฉด ์์ฃผ ์ ํ๊ฒ ๋๋ Comparator ์ธํฐํ์ด์ค์ compare๋ฉ์๋ ๋ํ ์ต๋ช ๊ตฌํ ๊ฐ์ฒด๋ก ์ฌ์ฉํ ์๋ ์์ง๋ง, ๋๋ค์์ผ๋ก ๊ฐ๋จํ๊ฒ ํํํ ์ ์๋ค.
// Comparator ์ธํฐํ์ด์ค์ compare๋ฉ์๋ ์ต๋ช
๊ตฌํ ๊ฐ์ฒด
Arrays.sort(time, new Comparator<int[]>() {
@Override
public int compare(int[] t1, int[] t2) {
if(t1[0] == t2[0]) return t1[1] - t2[1];
else return t1[0] - t2[0];
}
});
// ๋๋ค์
Arrays.sort(time, (t1, t2)->{
if(t1[0] == t2[0]) return t1[1] - t2[1];
else return t1[0] - t2[0];
});
ํจ์ํ ์ธํฐํ์ด์ค
๋๋ค ํํ์์ผ๋ก ๊ตฌํ์ด ๊ฐ๋ฅํ ์ธํฐํ์ด์ค๋ ์ถ์ ๋ฉ์๋๋ฅผ 1๊ฐ๋ง ๊ฐ์ง๊ณ ์๋ ์ธํฐํ์ด์ค๋ง ๊ฐ๋ฅํ๋ค.
๊ทธ๋์ ์ถ์ ๋ฉ์๋๊ฐ 1๊ฐ์ธ ์ธํฐํ์ด์ค๋ฅผ ํจ์ํ ์ธํฐํ์ด์ค๋ผ๊ณ ํ๋ค.
// ์ฝ์ ์ฌ์ฉ ์์
@FunctionalInterface
interface CustomFunction{
void customMethod();
}
// ์ฌ์ฉ 1. ๋๋ค์์ ์ฐธ์กฐํ๋ ์ฐธ์กฐ๋ณ์๋ก ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ง์ ํ๊ณ , ์ฐธ์กฐ๋ณ์์์ ๋ฉ์๋๋ฅผ ํธ์ถ
CustomFunction cf = () -> System.out.println("This is FunctionalInterface");
customMethod(cf); // This is FunctionalInterface
// ์ฌ์ฉ 2. ์ฐธ์กฐ๋ณ์ ์์ด ๋ฐ๋ก ๋๋ค์์ ๋ฉ์๋๋ก ์ฌ์ฉ
customMethod() -> System.out.println("This is FunctionalInterface");
// ๋งค๊ฐ๋ณ์๋ฅผ ๋ฐ๊ณ ๋ฆฌํดํด์ฃผ๋ ์์
@FunctionalInterface
interface CustomFunction{
int customMethod(int a, int b);
}
CustomFunction cf = (a, b) -> a > b ? a : b;
int bigNum = cf.customMethod(1, 2);
@FunctionalInterface
: ํด๋น ์ธํฐํ์ด์ค๊ฐ ํจ์ํ ์ธํฐํ์ด์ค๋ผ๋๊ฑธ ์๋ ค์ฃผ๋ ์ ๋
ธํ
์ด์
, ์ธํฐํ์ด์ค ์ ์ธ์ ํด๋น ์ ๋
ธํ
์ด์
์ ๋ถ์ด๋ฉด 2๊ฐ ์ด์์ ์ถ์ ๋ฉ์๋๊ฐ ์ ์ธ๋์ง ์์๋์ง ์ปดํ์ผ๋ฌ๊ฐ ์ฒดํฌํ์ฌ 2๊ฐ ์ด์์ ์ถ์ ๋ฉ์๋๊ฐ ์ ์ธ๋์ด ์๋ค๋ฉด ์ปดํ์ผ ์๋ฌ๊ฐ ๋ฐ์ํ๋ค.
๋ชจ๋ ์ ๋
ธํ
์ด์
๋ค์ ๊ธฐ๋ฅ์ด ๊ทธ๋ ๋ฏ, @FunctionalInterface
์ ์ปดํ์ผ๋ฌ์๊ฒ ํ์ธ์ ๋ถํํ๋ ๊ฒ์ผ ๋ฟ ์๋ถ์ด์๋ค๊ณ ํด์ ํจ์ํ ์ธํฐํ์ด์ค๋ก ๋์ํ์ง ์๋ ๊ฒ์ ์๋๋ค.
์๋ฐ์์ ํจ์ํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ํ์ค API java.util.function
๋ฅผ ์ ๊ณตํด์ค๋ค.
Variable Capture
Variable Capture
๋ ๋๋ค์์์ ํ๋ผ๋ฏธํฐ๋ก ๋๊ฒจ์ง ๋ณ์๊ฐ ์๋ ์ธ๋ถ์์ ์ ์๋ ๋ณ์๋ฅผ ์ฐธ์กฐํ๋ ๊ฒ์ ์๋ฏธํ๋ค.
๋๋ค์์์ ์ ๊ทผ ๊ฐ๋ฅํ ๋ณ์๋ค์ ์๋์ ๊ฐ๋ค.
๋ก์ปฌ ๋ณ์
static ๋ณ์
์ธ์คํด์ค ๋ณ์
Variable Capture
์๋ ์ ๋ณ์๋ค ์ค 1. ๋ก์ปฌ ๋ณ์
์ ๋ํ ์ ์ฝ ์กฐ๊ฑด์ด ์กด์ฌํ๋ค.
- ๋ก์ปฌ ๋ณ์๋
final
์ผ๋ก ์ ์ธ๋์ด์ผ ํ๋ค, final
๋ก ์ ์ธ๋์ด ์์ง ์์ ๋ก์ปฌ ๋ณ์๋Effectively Final
(์ ์ฌ final; final ์ฒ๋ผ ๋์)์ด์ด์ผ ํ๋ค. ์ฆ, ๊ฐ์ ์ฌํ ๋น์ด ์ผ์ด๋๋ฉด ์๋๋ค.
๋ฐ๋ผ์, ๋๋ค์์์ ๋ก์ปฌ ๋ณ์๋ง ๋ณ๊ฒฝ์ด ๋ถ๊ฐ๋ฅํ๊ณ , ๋๋จธ์ง ๋ณ์๋ค์ ์ฝ๊ธฐ ๋ฐ ์ฐ๊ธฐ๊ฐ ๊ฐ๋ฅํ๋ค.
์ด๋ฌํ ์ ์ฝ์ด ์กด์ฌํ๋ ์ด์ ๋ ์๋์ ๊ฐ๋ค.
1์ฃผ์ฐจ์์ ์ ๋ฆฌํ์๋ฏ์ด, JVM์์ ๋ก์ปฌ ๋ณ์๋ ์คํ ์์ญ์ ์์ฑ๋๋ค.
์ค์ ๋ฉ๋ชจ๋ฆฌ์๋ ๋ฌ๋ฆฌ JVM์์ ์คํ ์์ญ์ ์ฐ๋ ๋๋ง๋ค ๋ณ๋์ ์คํ์ด ๋ ์์ฑ๋์ด ์ฐ๋ ๋๋ผ๋ฆฌ๋ ๋ก์ปฌ ๋ณ์ ๊ณต์ ๊ฐ ๋ถ๊ฐ๋ฅ ํ๋ค.
๊ทธ๋ฆฌ๊ณ JVM์์ ์ธ์คํด์ค ๋ณ์๋ ํ ์์ญ์ ์์ฑ๋๊ธฐ ๋๋ฌธ์ ์ธ์คํด์ค ๋ณ์๋ ์ฐ๋ ๋๋ผ๋ฆฌ ๊ณต์ ๊ฐ ๊ฐ๋ฅํ๋ค.
๋๋ค์์ ๋ก์ปฌ ๋ณ์๊ฐ ์กด์ฌํ๋ ์คํ์ ์ง์ ์ ๊ทผํ์ง ์๊ณ , ๋ก์ปฌ ๋ณ์๋ฅผ ์์ (๋๋ค๊ฐ ๋์ํ๋ ๋ณ๋์ ์ฐ๋ ๋)์ ์คํ์ ๋ณต์ฌํ๋ค.
๊ทธ๋์ ๋ง์ฝ ์๋ ์ง์ญ ๋ณ์๊ฐ ์๋ ์ฐ๋ ๋๋ ์ฌ๋ผ์ ธ์ ๋ก์ปฌ ๋ณ์๊ฐ ์ฌ๋ผ์ ธ๋ ์๋ฌ๊ฐ ๋ฐ์ํ์ง ์๋๋ค.
๊ทธ๋์ ์ง์ง ๋ฌธ์ ๋ ๋ฉํฐ ์ฐ๋ ๋ ํ๊ฒฝ์์, ์ฌ๋ฌ ๊ฐ์ ์ฐ๋ ๋์์ ๋๋ค์์ ์ฌ์ฉํ๋ฉด์ ๋๋ค ์บก์ณ๋ง์ด ๊ณ์ ๋ฐ์ํ๋๋ฐ ์ด ๋ ์ธ๋ถ ๋ณ์ ๊ฐ์ ๋ถ๋ณ์ฑ์ ๋ณด์ฅํ์ง ๋ชปํ๋ค๋ฉด ๋๊ธฐ(sync)ํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ ์ ์๋ค.
์ด๋ฌํ ๋ฌธ์ ๋๋ฌธ์ ์ง์ญ๋ณ์์ ๋ํ ์ ์ฝ์ฌํญ์ด ์กด์ฌํ๊ฒ ๋๋ ๊ฒ์ด๋ค.
static ๋ณ์๋ ์ธ์คํด์ค ๋ณ์๋ ์คํ ์์ญ์ด ์๋ ํ ์์ญ์ ์์นํ๊ณ , ํ ์์ญ์ ๋ชจ๋ ์ฐ๋ ๋๊ฐ ๊ณต์ ํ๊ณ ์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ์ ์ง์ ์ ๊ทผํ๊ธฐ ๋๋ฌธ์ ๋ฌธ์ ๊ฐ ์๋ ๊ฒ์ด๋ค.
๋ฉ์๋, ์์ฑ์ ๋ ํผ๋ฐ์ค
Method Reference
๋๋ค์์ด ํ๋์ ๋ฉ์๋๋ง ํธ์ถํ๋ ๊ฒฝ์ฐ์๋ '๋ฉ์๋ ์ฐธ์กฐ(Method References)'๋ฅผ ํตํด ๋๋ค์์ ๋ ๊ฐ๋ตํ๊ฒ ํํํ ์ ์๋ค.
๋ฉ์๋๋ฅผ ์ฐธ์กฐํด์ ๋งค๊ฐ ๋ณ์์ ์ ๋ณด ๋ฐ ๋ฆฌํด ํ์ ์ ์์๋ธ๋ค. ๋๋ค์์์ ๋ถํ์ํ ๋งค๊ฐ ๋ณ์๋ฅผ ์ ๊ฑฐํ๋ ๊ฒ์ด ๋ชฉ์ ์ด๋ค.
ClassName::MethodName
or
ReferenceVariable::MethodName
Integer parseInt(String s) { // ๋ฉ์๋
return Integer.parseInt(s);
}
Function<String, Integer> f = s -> Integer.parseInt(s); // ๋๋ค์
Function<String, Integer> f = Integer::parseInt; // ๋ฉ์๋ ์ฐธ์กฐ
Function<String, String, Boolean> f = (s1, s2) -> s1.equlas(s2); // ๋๋ค์
Function<String, String, Boolean> f = String::equals; // ๋ฉ์๋ ์ฐธ์กฐ
Constructor References
์์ฑ์ ์ฐธ์กฐ(Constructor References)
๋ Constructor๋ฅผ ์์ฑํด์ฃผ๋ ์ฝ๋๋ก์จ ๊ฐ์ฒด ์์ฑ์ ์๋ฏธํ๋ค.
ClassName::new
Function<Integer, int[]> f = x -> new int[x]; // ๋๋ค์
Function<Integer, int[]> f = int[]::new; // ์์ฑ์ ์ฐธ์กฐ
Supplier<CustomClass> s = () -> new CustomClass(); // ๋๋ค์
Supplier<CustomClass> s = CustomClass:new; // ์์ฑ์ ์ฐธ์กฐ
Author And Source
์ด ๋ฌธ์ ์ ๊ดํ์ฌ([Become a Java-Masta๐จโ๐ซ 7์ฃผ์ฐจ] ์ ๋ ธํ ์ด์ , I/O, ์ ๋ค๋ฆญ, ๋๋ค์), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://velog.io/@bae_mung/Become-a-Java-Masta-7์ฃผ์ฐจ-์ ๋ ธํ ์ด์ -IO-์ ๋ค๋ฆญ-๋๋ค์์ ์ ๊ท์: ์์์ ์ ๋ณด๊ฐ ์์์ URL์ ํฌํจ๋์ด ์์ผ๋ฉฐ ์ ์๊ถ์ ์์์ ์์ ์ ๋๋ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค