0
2
4
6
8
10
12
14
16
2016-04
2016-08
2016-12
2017-04
2017-08
2017-12
2018-04
2018-08
2018-12
Android Projects
0
2
4
6
8
10
12
14
16
2016-04
2016-08
2016-12
2017-04
2017-08
2017-12
2018-04
2018-08
2018-12
Android Projects Others
0
2
4
6
8
10
12
14
16
2016-04
2016-08
2016-12
2017-04
2017-08
2017-12
2018-04
2018-08
2018-12
Android Projects Others
//	Java
public	class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
...
public String	getTitle()	{
return	this.title;
}
public void setTitle(String	title)	{
this.title =	title;
}
@Override
public String	toString()	{	...	}
...	
}
//	Kotlin
data	class Aritcle(
var articleId:	Int?	=	null,	
var viewCount:	Int =	0,	
var title:	String	=	“”
...
)
//	Java
public	class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
...
public String	getTitle()	{
return	this.title;
}
public void setTitle(String	title)	{
this.title =	title;
}
@Override
public String	toString()	{	...	}
...	
}
//	Kotlin
data	class Aritcle(
var articleId:	Int?	=	null,	
var viewCount:	Int =	0,	
var title:	String	=	“”
...
)
//	Java
public	class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
...
public String	getTitle()	{
return	this.title;
}
public void setTitle(String	title)	{
this.title =	title;
}
@Override
public String	toString()	{	...	}
...	
}
getter()
setter()
//	Kotlin
data	class Aritcle(
var articleId:	Int?	=	null,	
var viewCount:	Int =	0,	
var title:	String	=	“”
...
)
//	Java
public	class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
...
public String	getTitle()	{
return	this.title;
}
public void setTitle(String	title)	{
this.title =	title;
}
@Override
public String	toString()	{	...	}
...	
}
equals()
hashCode()
copy()
toString()
componentsN()
//	Kotlin
data	class Aritcle(
var articleId:	Int?	=	null,	
var viewCount:	Int =	0,	
var title:	String	=	“”
...
)
//	Java
public	class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
...
public String	getTitle()	{
return	this.title;
}
public void setTitle(String	title)	{
this.title =	title;
}
@Override
public String	toString()	{	...	}
...	
}
//	Kotlin
data	class Aritcle(
var articleId:	Int?	=	null,	
var viewCount:	Int =	0,	
var title:	String	=	“”
...
)
//	Java
public	class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
...
public String	getTitle()	{
return	this.title;
}
public void setTitle(String	title)	{
this.title =	title;
}
@Override
public String	toString()	{	...	}
...	
}
//	Java
public	class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
...
public void setViewCount(int viewCount)	{
this.viewCount =	viewCount;
}
}
//	use	case
Integer	nullableNum =	null;
article.setViewCount(nullableNum);
//	Java
public	class Member	{
private	Integer	memberId;
private	int age;
private String	name;
public void setMemberId(Integer	memberId)	{
if(memberId ==	null)	{
//	do	something
}
this.memberId =	memberId;
}
...	
}
Integer	nullableNumber =	null;
member.setAge(nullableNumber);
//	runtime	error!!
//	Kotlin
data	class Aritcle(
var articleId:	Int?	=	null,	
var viewCount:	Int =	0,	
var title:	String	=	“”
...
)
//	use	case
var nullableNum:	Int?	=	null
article.viewcount =	nullableNum
//	Java
public	class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
...
public void setViewCount(int viewCount)	{
this.viewCount =	viewCount;
}
}
//	use	case
Integer	nullableNum =	null;
article.setViewCount(nullableNum);
//	Java
public	class Member	{
private	Integer	memberId;
private	int age;
private String	name;
public void setMemberId(Integer	memberId)	{
if(memberId ==	null)	{
//	do	something
}
this.memberId =	memberId;
}
...	
}
Integer	nullableNumber =	null;
member.setAge(nullableNumber);
//	runtime	error!!
//	Kotlin
data	class Aritcle(
var articleId:	Int?	=	null,	
var viewCount:	Int =	0,	
var title:	String	=	“”
...
)
//	use	case
var nullableNumber:	Int?	=	null
article.viewcount =	nullableNumber
//	Java
public	class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
...
public void setViewCount(int viewCount)	{
this.viewCount =	viewCount;
}
}
//	use	case
Integer	nullableNum =	null;
article.setViewCount(nullableNum);
//	Java
public	class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
...
public void setViewCount(int viewCount)	{
this.viewCount =	viewCount;
}
}
Integer	nullableNum =	null;
article.setViewCount(nullableNum);
//	Kotlin
data	class Aritcle(
var articleId:	Int?	=	null,	
var viewCount:	Int =	0,	
var title:	String	=	“”
...
)
//	use	case
var nullableNum:	Int?	=	null
article.viewcount =	nullableNum
//	Java
@Getter
@Setter
public class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
}	
//	auto-converted	kotlin
@Getter
@Setter
class Article	{
private val articleId : Int?	=	null
private val viewCount : Int =	0
private val title : String?	=	null
}
//	Java
@Getter
@Setter
public class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
}	
//	auto-converted	kotlin
@Getter
@Setter
class Article	{
private val articleId : Int?	=	null
private val viewCount : Int =	0
private val title : String?	=	null
}	
public	getter()
public	setter()
//	Java
@Getter
@Setter
public class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
}	
//	auto-converted	kotlin
@Getter
@Setter
class Article	{
private val articleId : Int?	=	null
private val viewCount : Int =	0
private val title : String?	=	null
}	
동작하지 않는 Annotation
//	Java
@Getter
@Setter
public class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
}	
//	auto-converted	kotlin
@Getter
@Setter
class Article	{
private val articleId : Int?	=	null
private val viewCount : Int =	0
private val title : String?	=	null
}	
외부에서 참조 불가능한 properties
//	Java	without	Lombok
public class Article	{	
private	Integer	articleId;
private	int viewCount;
private String	title;
public Integer	getMemberId()	{	
return this.memberId;	
}	
...
}
//	Java	with	Lombok
@Data
public class Article	{
private	Integer	articleId;
private	int viewCount;
private String	title;
}
//	auto-converted	Kotlin
class Article	{	
var articleId:	Int?	=	null
var viewCount:	Int =	0
var title:	String?	=	null
override	fun	toString():	String	{
return	“Article{”
+	“articleId=“ + articleId
+	“,	viewCount=”	+ viewCount
+	“,	title=‘”	+ title
+ ‘’’.toString()	+	‘}’.toString()
}	...
}
//	Java	without	Lombok
public class Article	{	
private	Integer	articleId;
private	int viewCount;
private String	title;
public Integer	getMemberId()	{	
return this.memberId;	
}	
...
}
//	refactored	Kotlin
data	class Article	(	
var articleId:	Int?	=	null
var viewCount:	Int =	0
var title:	String	=	“”
)
//	auto-converted	Kotlin
class Article	{	
var articleId:	Int?	=	null
var viewCount:	Int =	0
var title:	String?	=	null
override	fun	toString():	String	{
return	“Article{”
+	“articleId=“ + articleId
+	“,	viewCount=”	+ viewCount
+	“,	title=‘”	+ title
+	‘’’.toString()	+	‘}’.toString()
}	...
}
@Slf4j
public	class	LogExaple {
}
//	Java
@Controller
public	class ArticleController {
@Autowired
private	ArticleService articleService;
@Autowired
private	TagService tagService;
}
@Slf4j
public	class	LogExaple {
}
//	Kotlin
@Controller
class ArticleController {
@Autowired
private	var articleService :	ArticleService
@Autowired
private	var tagService :	TagService
}
동작하지 않는 필드 주입
@Slf4j
public	class	LogExaple {
}
//	Java
@Controller
public	class ArticleController {
@Autowired
private	ArticleService articleService;
@Autowired
private	TagService tagService;
}
@Slf4j
public	class	LogExaple {
}
//	Kotlin
@Controller
class ArticleController {
@Autowired
private	var articleService :	ArticleService?	
=	null
@Autowired
private	var tagService :	TagService?	
=	null
}
@Slf4j
public	class	LogExaple {
}
//	Java
@Controller
public	class ArticleController {
@Autowired
private	ArticleService articleService;
@Autowired
private	TagService tagService;
}
@Slf4j
public	class	LogExaple {
}
//	Kotlin
@Controller
class ArticleController {
@Autowired
private	lateinit var articleService :	
ArticleService
@Autowired
private	lateinit var tagService :	TagService
}
@Slf4j
public	class	LogExaple {
}
//	Java
@Controller
public	class ArticleController {
private	final ArticleService articleService;
private	final TagService tagService;
public ArticleController(
final ArticleService articleService,
final TagService tagService)	{
this.articleService =	articleService;
this.tagService =	tagService;
}
}
@Slf4j
public	class	LogExaple {
}
//	Kotlin
@Controller
class ArticleController(
private	val articleService :	ArticleService,
private	val tagService :	TagService)	{
}
@Slf4j
public	class	LogExaple {
}
@RequestMapping(“/”)
@Controller
class SearchController {
@GetMapping
fun search(@RequestParam(required	=	true)	keyword	:	String?)	{ //	Java와 동일하게 사용
return “/result”
}
}
필수로 명시하였지만 Optional로 동작
@Slf4j
public	class	LogExaple {
}
@RequestMapping(“/”)
@Controller
class SearchController {
@GetMapping
fun search(@RequestParam keyword	:	String)	{
return “/result”
}
}
@Slf4j
public	class	LogExaple {
}
//	Java
public	class Article	{
public	static	final String	DEFAULT_THUMBNAIL
=	“..”;
...
public	static	String	thumbnail()	{
...
}
...
}
//	Kotlin
class Article	{
companion	object {
val DEFAULT_THUMBNAIL =	“..”
fun thumbnail():	String	{
...
}
}
...
}
@Slf4j
public	class	LogExaple {
}
//	Java
public	class Article	{
public	static	final String	DEFAULT_THUMBNAIL
=	“..”;
...
public	static	String	thumbnail()	{
...
}
...
}
//	Kotlin
class Article	{
companion	object {
const val DEFAULT_THUMBNAIL =	“..”
@JvmStatic
fun thumbnail():	String	{
...
}
}
...
}
@Slf4j
public	class	LogExaple {
} when (x)	{
0, 1	->	print("x	==	0	or	x	==	1")			
parseInt(s)	->	print("s	encodes	x")
isEven()	->	print("x	is	even")
in 1..10 ->	print("x	is	in	the	range")
in validNumbers ->	print("x	is	valid")
is String	->	x.startsWith("prefix")
else ->	print("otherwise")
}
@Slf4j
public	class	LogExaple {
}
//Java
if (isFromRobot(userAgent))	{
return	false;
}	else	if (isValidUser(cookie))	{
return	false;
}	else {
return	true;
}
//Kotlin
return when {
isFromRobot(userAgent)	->	false
isValidUser(cookie)	->	false
else ->	ture
}
@Slf4j
public	class	LogExaple {
}
//Kotlin
@Controller
class ArticleController {
…
@GetMapping(“/article/{articleId}”)
fun blog(model:	Model,	@PathVariable articleId :	String):	String	{
Article	article =	articleRepository.find(articleId)
model["title"]	=	article.title //model.addAttribute("title",	article.title)
return “article"
}
}
2375
2272 2259 2239
102060
96183
93578
92208
//Java
@Service
public class JavaController {
@Autowired
private JavaService javaService;
..
}
//Kotlin
@Service
class KotlinController(private val kotlinService:	KotlinService)	
{
..	
}
462 454
438
402
//Java
var imgUrl:	String	=	DEFAILT_IMG_URL
if (isMediaType())	{
imgUrl =	media.getThumbnail()
}	else if (hasMediaHolder())	{
imgUrl =	getHolder()
}	else if {
…
}
//Kotlin
val imgUrl =	when {
isMediaType()	->	media.thumbnail
hasMediaHolder()	->	getHolder()
…
else ->	DEFAILT_IMG_URL
}
232
217
205 205
//Java
List<Menu> displayedMainMenus =	MainMenus.stream()
.filter(e	->	e.getDisplayed())
.collect(Collectors.toList());
//Kotlin
val displayedMainMenus:	List<Menu>	
=	mainMenus.filter {	it.displayed }
[2019] PAYCO 매거진 서버 Kotlin 적용기
[2019] PAYCO 매거진 서버 Kotlin 적용기
[2019] PAYCO 매거진 서버 Kotlin 적용기
[2019] PAYCO 매거진 서버 Kotlin 적용기
[2019] PAYCO 매거진 서버 Kotlin 적용기
[2019] PAYCO 매거진 서버 Kotlin 적용기
[2019] PAYCO 매거진 서버 Kotlin 적용기
[2019] PAYCO 매거진 서버 Kotlin 적용기

[2019] PAYCO 매거진 서버 Kotlin 적용기