기존 인터넷 네트워크

 : 클라이언트가 요청한 내용이 '복잡한 인터넷 망' 속에서 여러 노드를 걸쳐 패킷으로 전송

 

TCP/IP

: 인터넷과 관련된 모든 Protocol 의 총칭

 

TCP/IP의 4계층(TCP/IP 4-Layer)

Application 계층 HTTP, FTP, DNS 등
Transport 계층 TCP, UDP
Internet 계층 IP
Network Interface 계층 물리적 네트워크

 

IP (Internet Protocol)

- 패킷(Packet) 통신 단위로 출발지 IP -> 도착지 IP Address 에 데이터 전달(애플리케이션 계층에서 전달받은 전송데이터에 IP 정보를 추가하여 전송)

 

- IP 가 가진 대표 정보

1. 출발지 IP

2. 도착지 IP

 

- IP의 한계

1. 비연결성 : 패킷을 보냈는데 상대가 수신받지 못하는 경우, 패킷은 그대로 전송되나 확인할 수 없음

2. 비신뢰성 : 패킷이 중간에 소실되거나 순서대로 받지 못하는 경우

3. 프로그램 구분 : 같은 IP를 사용하는 서버에서 통신하는 Application이 둘 이상일 시

-> TCP 가 보완

 

TCP(Transmission Control Protocol), 전송제어 프로토콜

- 신뢰할 수 있는 프로토콜로 Internet 계층으로 전달 전 순서, 보증, 검증에 대한 정보를 추가

 

- TCP 가 가진 대표 정보

1. 출발지/도착지 PORT

2. 전송제어, 순서, 검증정보 (UDP와의 차이점)

 

- TCP 특징

1. 3 Way HandShake : 연결지향 (연결을 확인 한 후 데이터 전송, 비연결로 인한 서비스 불능 방지)

* 연결과정 :

 ① 클라이언트 -> 서버 : SYN(접속 요청)

 ② 서버 -> 클라이언트 : SYN+ACK(접속 요청, 요청 수락)

 ③ 클라이언트 -> 서버 : ACK(요청 수락)

 ④ 데이터 전송

2. 데이터 전달보증 : 데이터 소실 방지

3. 데이터 순서보장

 

DNS

- IP 를 기억하기 어려움과, IP 교체시 발생할 수 있는 문제를 해결

OSI 모델 (Open Systems Interconnection Reference Model)

: 국제표준화기구(ISO)에서 만든 네트워크 통신의 7단계 과정

응용 계층
(Application Layer)
- 사용자 지원계층
- 서로 관련없는 소프트웨어시스템들의 상호연동을 가능하게 함
표현 계층
(Presentation Layer)
세션 계층
(Session Layer)
전송 계층
(Transport Layer)
- 상위계층(네트워크/데이터링크/물리 계층)<->하위계층(응용/표현/세션 계층)을 연결
- 하위계층에서 전송한 내용을 상위계층이 사용할 수 있는 형태가 되도록 보장
네트워크 계층
(Network Layer)
- 한 장치에서 다른 장치로 데이터 전송 시 필요한 물리적인 부분을 처리
(전기적인 규격, 물리연결, 물리주소 등)
데이터링크 계층
(DataLink Layer)
물리 계층
(Physical Layer)

 

7. 응용 계층 (Application Layer)

- 사용자가 네트워크에 접근할 수 있도록 함

- 사용자에게 보이는 유일한 계층이며 사용자를 위한 인터페이스 제공(FTP, SMTP, HTTP, DNS 등)

 

6. 표현 계층 (Presentation Layer)

- 응용계층으로부터 받은 데이터를 표준 포멧으로 변환

- 세션계층에서 온 데이터를 응용프로그램이 인식할 수 있는 데이터포멧으로 변환하여 응용계층에 전달(인코딩, 디코딩, 압축 등)

 

5. 세션 계층 (Session Layer)

- 프로세스사이에서 세션(Session)이라 불리는 연결의 확립하고 유지하며 동기화 하는 기능을 제공

- 표현계층으로부터 받은 데이터를 효율적인 세션관리를 위해 잛은 데이터 단위로 나눈 후에 전송 계층으로 내려 보냄

 

4.  전송 계층 (Pransport Layer)

- 세션을 맺고 있는 두 사용자 사이의 데이터 전송을 위한 종단간(End-to-End, 송신컴퓨터의 응용프로그램 - 수식컴퓨터의 응용프로그램) 제어를 담당

 

3. 네트워크 계층 (Network Layer)

- 송신자측에서 수신자측까지 데이터를 안전하게 전달하는 역할

- 논리적 링크를 설정하고 상위 계층 데이터를 작은 크기의 패킷으로 분할하여 전송하는 역할을 수행

 

2. 데이터링크 계층 (DataLink Layer)

- 물리계층 그대로의 전송설비를 신뢰할 수 있는 링크로 변환

- 상위계층인 네트워크에게 오류가 없는 물리계층로 보이도록 함

- 물리계층에서 전송하는 비트(Bit)에 대한 비트 동기 및 식별기능, 원활한 데이터의 전송을 위한 흐름제어, 안전한 데이터 전송을 위한 오류제어 기능 등을 수행

 

1. 물리 계층 (Physical Layer)

- 데이터를 물리매체상으로 전송하는 역할을 담당하는 계층

- 전송을 위해 필요한 물리적 링크의 설정, 유지, 해제를 담당

- 사용자장비와 네트워크 종단장비 사이의 물리적, 전기적인 인터페이스 규정, 전송 선로 종류에 따라 전송방식과 인코딩방식 결정

○ linux hostname 명령어(IP/NAME) 정리

- hostname -I : host IP

- hostname -A : host Name

 

ShellScript 작성 시 명령어 값 변수 선언 방식

#!/bin/bash

SERVER_HOST_NAME = $hostname -A
SERVER_HOST_IP = $hostname -I

'OS > Linux' 카테고리의 다른 글

Linux에서 Java class 실행시키기  (0) 2018.05.11
Package 이름으로 Process PID 찾기 (Java기준 작성)  (0) 2018.05.09

○ 코딩 작성 중 실수 내용

- 코딩테스트 문제를 풀던 중 JAVA 제곱근을 사용해야 하는 코드가 나왔는데 Math.pow(a,b)가 아닌 a^b를 사용

 

○ 원인 파악

- '^'는 XOR 논리연산자

A B A XOR B
0 0 0
0 1 1
1 0 1
1 1 0

(ex. JAVA에서 4^7 실행 시-> 2진법 100 , 111의 XOR 연산자로 011 정답 3)

- 알고 있었으나 습관적으로 a^b라고 사용

- 왜 저게 습관이 되었는지 생각해보니 컴퓨터상으로 문서작성(hwp, word) 을 할 때 제곱근을 표현할 수 없어 자주 a^b라고 작성했는데 JAVA에도 무심코 사용하면서 오류 발생

- 코딩테스트 진행 시 알게모르게 작성했다가 Error원인이 파악 안되면서 이상한 곳에서 시간을 잡아먹는것을 방지하지 위해 오답노트 작성

○ 문제링크

https://www.hackerrank.com/challenges/java-stdin-stdout/problem

 

Java Stdin and Stdout II | HackerRank

Familiarize yourself with Standard Input/Output.

www.hackerrank.com

 

○ 문제 내용 요약

Input Format

There are three lines of input:

  1. The first line contains an integer.
  2. The second line contains a double.
  3. The third line contains a String.

Output Format

There are three lines of output:

  1. On the first line, print String: followed by the unaltered String read from stdin.
  2. On the second line, print Double: followed by the unaltered double read from stdin.
  3. On the third line, print Int: followed by the unaltered integer read from stdin.

To make the problem easier, a portion of the code is already provided in the editor.

Note: If you use the nextLine() method immediately following the nextInt() method, recall that nextInt() reads integer tokens; because of this, the last newline character for that line of integer input is still queued in the input buffer and the next nextLine() will be reading the remainder of the integer line (which is empty).

import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        
        int i = scan.nextInt();
        // Write your code here.

        System.out.println("String: " + s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
}

 

○ 문제의 핵심

- scan.nextInt() 동작 이후 scan.nextLine() 진행시 개행문자 '\n' 이 개행문자로 남아 다음 본문을 재대로 인식하지 못한 부분을 해결

 

○ 해결방법

1. int, double도 scan.nextLine()으로 입력받은 후 Integer.parseInt(String); Double.parseDouble(String); 으로 변경

(BUT, 해당 문제는 최초에 Write your Code here 전 int i 를 받고 있어 다음 문장을 작성해야하므로 Integer.parseInt(String) 를 사용할 수 없음)

2. 숫자 먼저 받은 후(int, Double) String을 받기전 scan.nextLine(); 으로 개행문자 제거

다음 scan.nextLine(); 을 이용해 정상적인 문자열 scan 진행

import java.util.Scanner;

public class Solution {

    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        
        int i = scan.nextInt();
        // Write your code here.
        double d = scan.nextDouble();
        scan.nextLine();
        String s = scan.nextLine();

        System.out.println("String: " + s);
        System.out.println("Double: " + d);
        System.out.println("Int: " + i);
    }
}

Controller에서 작업 중 특정 back URL로 redirect를 하는 상황이 생긴다.

아래와 같이 작성하면 된다.

 

URL redirect 소스코드(Java)

	@RequestMapping("redirect")
	public String redirectTest(String url){
		return "redirect:" + url;
	}

 

이렇게 보내면 redirect를 이용해서 URL을 보낼 수 있지만 parameter도 필요하다면?

다양한 방법이 있지만 java에 model과 jsp에 jquery를 이용해 redirect하는 방법을 제시하고자 한다.

 

URL redirect parameter 추가 소스코드(Java, jsp)

	@RequestMapping("redirect")
	public String redirectTest(String url, Model model){
		model.addAttribute("name","호파");
		model.addAttribute("local","seoul");
		model.addAttribute("sex","m");
		model.addAttribute("redirectUrl",url);
		return "redirect" //view->redirect.jsp를 호출
	}

 

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>




redirectTest




'Programming > JAVA' 카테고리의 다른 글

TCP/IP Socket 통신 프로그래밍 (Java Sample 소스코드)  (0) 2018.05.01

Linux에서 Java 클래스를 올려 실행시키는 방법에 대한 정리를 하겠습니다. Java클래스를 실행하기 전에

Linux서버에 java파일을 올리는 것이 첫번째로 해야 합니다. 당연히 java 파일이 있어야 컴파일과 실행을 진행할 수 있습니다.
첫번째로 서버에 저장하는 방법을 확인해보겠습니다!


작성한 java 파일, jar를 서버에 저장하기

- FTP 클라이언트 소프트웨어 파일질라(FileZilla)를 이용하여 간편하게 서버에 접속하고 파일을 저장한다.

파일질라(FileZilla) : 오픈 소스 크로스 플랫폼의 자유 소프트웨어인 FTP 소프트웨어로
파일질라 클라이언트와 파일질라 서버로 구분되어 있다.

서버와 클라이언트의 파일 업/다운로드를 간편하게 할 수 있도록 도와준다. (다운로드 링크 https://filezilla-project.org/)


Linux에서 Java 실행 시키기

1. 패키지 선언이 선언이 된 java 파일을 컴파일하여 실행하기

간단하다. 올린 클래스 파일에 대해 linux 명령어로 컴파일을 하고 실행시킨다.


- java 파일 컴파일 하기

 [root@dev test]javac . HelloWorld.java

위 명령어는 현재 디렉토리에 HelloWorld.java 파일이 존제해야 실행 가능하다.
명령어에 존재하는 점(.)은 현재 디렉토리를 classpath로 지정하겠다는 의미이며
java 실행시 class 파일을 찾을 때 사용되는 경로(classpath)가 된다.

다음으로 java 명령어를 이용해 컴파일 된 class를 실행시키면 된다.

- 컴파일 된 class를 실행시키기

 [root@dev test] java HelloWorld.class

 

2. Jar 파일을 classpath에 추가한 후 컴파일하여 실행하기

먼저 Jar 파일이 무엇인지 확인해보자 

Jar = Java Archive(자바 아카이브)

여러개의 파일을 하나로 묶어서 실행할 수 있게 도와주며
jar로 만들었을 때 프로그램의 경로나 파일의 위치에 상관없이 실행이 가능한 .jar 형식의 파일이다.

1) 실행가능한 jar 파일 만들기

eclipse로 project java를 만들었다면 내부 Export 기능을 이용하여 더 편리하게 할 수 있으나
Linux내용 포스트이기 때문에 명령어로 정리해 작성해보자!!!!!

작성한 java 파일이 2개 이상이라면 먼저 실행되어야 하는 main() 함수가 어떤 class에 존재하는지 위치를 지정해야 한다.
위치에 대한 정보를 가지고 실행시 정보를 전달해주는 manifest.txt 파일을 먼저 생성한다.

두개의 예시 class로 확인해보자 ( ex-class : HelloWorldMain.class, HelloWorldSub.class )
예시는 HelloWorldMain.java, HelloWorldSub.java가 컴파일 된 상태에서 시작하니 위 1번을 참고한 후 진행한다.

- manifest.txt 파일 생성

[root@dev test] vim manifst.txt
>Main-Class :HelloWorldMain

이후 jar 명령어를 이용해 jar 파일을 생성한다.

- jar 파일 생성 example (Hello.jar 생성)

 [root@dev test] jar -cvmf manifest.txt Hello.jar *.class

 

Linux 서버 내에서 tomcat이 아닌 Java Application으로 만들어 Socket프로그램을 계속 돌릴 수 있게 하기 위해
Java Class 세개와 시작과 중지를 담당하는 두 개의 shell script를 만들게 되었습니다.

작업을 진행하면서 사용하게 된 Linux PID 얻기 관련 명령어를 정리해보겠습니다.

 


1. 프로세스 PID 확인하기

 ps -ef | grep com.socket.server.Server

현재 패키지(com.socket.server)에 클래스(Server)가 프로세스로 실행이 되고 있는지 확인하는 명령어이다.


cmd Result

[root@dev test]# ps -ef | grep com.socket.server.Server
root     32298     1  0 09:46 pts/1    00:00:02 /usr/local/java/bin/java -server -mx128M -ms64M -cp :./lib/TomcatActionSocket.jar:./lib/log4j-1.2.17.jar -DServerHome=. -Dpid=32297 com.socket.server.ServerSocketConnect
root     32545 32059  0 11:05 pts/2    00:00:00 grep com.socket.server.Server

 

 

2. 프로세스 PID만 얻어오기

 ps -ef | grep com.socket.server.Server | awk '{print $2}'

위 1번 cmd를 실하면 result와 같이 process정보를 각 열로 정리해서 보여준다
우리가 원하는 PID 정보는 2열에 존재하며 awk '{print $2}'를 붙이면 원하는 결과를 가져올 수 있다.

print 숫자에 따른 값 정보

$1 (권한)

$2 (Process ID)

$3 (부모 Process ID)

 $4~~ (etc)

 root

33298

 1

 ....(이 외 정보들)

참고로 awk '{print $2}'에 숫자는
awk '{print $1, $2}', awk '{print $1 $2}' 등 원하는 정보값을 열에 맞게 설정해서 가져올 수 있다.


cmd Result

[root@dev test]# ps -ef | grep com.socket.server.Server | awk '{print $2}'
32298
32583
[root@dev test]# ps -ef | grep com.socket.server.Server | awk '{print $1,$2}'
root 32298
root 32586

 

 

3. 얻어 온 PID정보를 파일로 저장하기

 ps -ef | grep com.socket.server.Server | awk '{print $2}' > pid

검색한 정보를 현재 디렉토리에 pid라는 이름으로 저장하는 명령이다.
이번 프로젝트를 하면서 개인적으로
PID값을 저장해서 shell Script에서 for문을 사용할 때 pid라는 파일을 불러와 사용하고 있다.


cmd Result

[root@dev test]# ps -ef | grep com.socket.server.Server | awk '{print $2}' > pid
[root@dev test]# vim pid
32005
32293

 

'OS > Linux' 카테고리의 다른 글

[ShellScript] Host IP/Name 불러오기, 변수선언  (0) 2021.01.19
Linux에서 Java class 실행시키기  (0) 2018.05.11

회사업무 중 Linux서버에 소켓서버를 둔 후 Client에서 shellScript를 실행시키는 프로그래밍을 하게 되었습니다.

이와 관련된 내용을 정리함과 동시에 sample소스를 함께 추가해보겠습니다!

 


- TCP/IP Socket 통신?

클라이언트와 서버가 지정된 포트를 이용해 통신한다.

클라이언트에서 연결하거나 데이터 교환시에 포트를 이용하며 JAVA에서는 ServerSocket와 Socket를 이용하여 구현한다.

 

- Client Socket (클라이언트 소켓)

최초 포트에 접속을 요청하는 소켓이다. 서버소켓으로 연결을 요청하고 데이터 전송을 한다.

 

- Server Socket (서버 소켓)

서버에서만 사용되는 소켓으로 클라이언트에서 연결 요청이 오기까지 대기상태를 유지않다.

이후 연결 요청시 클라이언트화 연결을 하고 서버내에 소켓을 만들어 데이더 작업을 진행한다.

 

Java 소켓통신 관련 소스코드

클라이언트 소켓과 서버소켓을 sample 소스코드를 소개합니다.

아래의 코드는 가장 기본코드이며

Server소스에서는 Thread를 구현하여 여러 클라이언트가 들어와도 작업을 처리할 수 있도록 해주는 것이 더 좋습니다.

 

Client.java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.Socket;
import java.net.UnknownHostException;

public class Client {
	
	final static String SERVER_IP = "127.0.0.1"; 
	final static int SERVER_PORT = 1225;
	final static String MESSAGE_TO_SERVER = "Hi, Server";
	
	public static void main(String[] args) {
		
		Socket socket = null;
		
		try {
			/** 소켓통신 시작 */
			socket = new Socket(SERVER_IP,SERVER_PORT);
			System.out.println("socket 연결");
		
			/**	Client에서 Server로 보내기 위한 통로 */
			OutputStream os = socket.getOutputStream();
			/**	Server에서 보낸 값을 받기 위한 통로 */
			InputStream is = socket.getInputStream();
			
			os.write( MESSAGE_TO_SERVER.getBytes() );
			os.flush();
			
			byte[] data = new byte[16];
			int n = is.read(data);
			final String resultFromServer = new String(data,0,n);
			
			System.out.println(resultFromServer);
			
			socket.close();
		} catch (UnknownHostException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

 

Server.java

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server extends Thread {
	
	final static int SERVER_PORT = 1225;
	final static String MESSAGE_TO_SERVER = "Hello, Client";
	
	public static void main(String[] args) {
		
		ServerSocket serverSocket = null;
		
		try {
			serverSocket = new ServerSocket(SERVER_PORT);
			
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
		try {
			while (true) {
				System.out.println("socket 연결 대기");
				Socket socket = serverSocket.accept();
				System.out.println("host : "+socket.getInetAddress()+" | 통신 연결 성공");
				
				/**	Server에서 보낸 값을 받기 위한 통로 */
				InputStream is = socket.getInputStream();
				/**	Server에서 Client로 보내기 위한 통로 */
				OutputStream os = socket.getOutputStream();
				
				byte[] data = new byte[16];
				int n = is.read(data);
				final String messageFromClient = new String(data,0,n);
				
				System.out.println(messageFromClient);
				
				os.write( MESSAGE_TO_SERVER.getBytes() );
				os.flush();
				
				is.close();
				os.close();
				socket.close();
			}
			
		} catch (IOException e) {
			e.printStackTrace();
		}
		
	}
}

class SocketRun implements Runnable {

	private Socket socket = null;
	
	SocketRun( Socket socket ){
		this.socket = socket;
	}
	
	@Override
	public void run() {
		
	}
}

'Programming > JAVA' 카테고리의 다른 글

[Java] 특정 URL로 redirect 하기  (0) 2018.05.28

안녕하세요

이번 포스트 전까지는 항상 이론을 정리하는 '공통 기초'글만 작성했는데

이 글을 쓰면서 개인공부와 정보공유 두가지 효과를 보고 싶습니다ㅎㅎ

 

오늘까지는 소개이고 다음 코틀린 포스트부터 코딩과 함께 기초적인 문법관련 글을 준비할 예정입니다.

 

지금부터 포스트 시작합니다!

 


 

 

 

코틀린(Kotlin) 소개

 

대표적인 프로그래밍 언어인 C, Java를 비롯하여 시간이 지나면서 개발환경, 페러다임의 변화에 발맞춰 많은 새로운 언어들이 발표되고 있습니다.

 

이런 흐름속에서 JetBrains(제트브레인)사 에서 코틀린(Kotlin)이란 새 언어를 발표하게 됩니다.

JetBrains사는 우리에게 익숙한 InteliJ, PyCharm IDE를 만든 개발회사이다.

추가로 JetBrains은 구글과 협업으로 Android Studio IDE도 만들었다.

 

2016년에 1.0 정식버전이 나온 후 2017년 5월, 구글 I/O행사에서 안드로이드 공식언어로 지정하였습니다.

 

 

- 코틀린(Kotlin) 언어의 특징

 

1. Java, 안드로이드 100% 호환

- Kotlin은 개발코드가 Java클래스로 빌드되어 JVM(자바가상머신)에서 동작하기 때문에 호환이 가능합니다.

이 뜻은 Java로 개발되던 프로그램을 Kotlin 뿐만 아닌 JVM을 기반으로 하는 모든언어로 개발할 수 있다는 것입니다.

 

2. Java, 안드로이드, 브라우저, 네이티브 애플리케이션 개발(범용성 향상)

- Java로 개발된 서버 Web 어플리케이션 뿐만이 아닌 javaScript개발도 가능한 언어를 목표로 발전하고 있습니다.

코틀린 공식블로그에서 JVM, javaScript 이외 iOS, Iot등 다른 플랫폼에서도 사용할 수 있도록 하는것이 Kotlin의 목표라고 말하고 있습니다.

 

3. InteliJ, 안드로이드 스튜디오, 이클립스, Commend 등을 통한 개발

- Kotlin은 JetBrains 그룹에서 만들었지만 JetBrains에서 개발한 IDE에서만 사용가능한 것은 아닙니다.

Kotlin은 개발환경을 특정 개발 도구로 한정하지 않으며 JetBrains IDE를 제외하고 현재 Eclipse, Commend Line Interface에서도 개발이 가능합니다.

 

4. 코드의 간결함

- 다른 언어보다 다양한 프로그래밍 기법을 제공합니다.

바로 아래 Kotlin을 Java와 비교한 자세한 설명을 읽어보면서 코드의 간결함을 직접 확인해보세요!

 

 

- Java와 코틀린(Kotlin)

 

Kotlin은 Java와 비슷하면서도 차이점을 명확이 두고 있습니다.

지금까지 Kotlin 1.2버전까지 출시되었으며 차이점은 아래 설명한 4가지 외에도 많지만 두 언어를 대표할 수 있는 차이만을 비교해보겠습니다.

 

1. Null에 대한 안전성

- 저와 같은 초보개발자 모두가 그렇지는 않지만 저는 Java개발을 하면서 NullPointException에서 애를 먹었던 적이 많습니다.

그렇기에 항상 Null을 처리해주는 코드를 작성하게 되었고 이는 개발코드가 지저분해지는 원인이였지만 이를 처리하는 기법을 제공해줌으로 조금 더 쉬운 개발을 할 수 있습니다.

 

2. 확장 함수

- Java에서도 클랫를 상속하여 하위 클래스에 기능을 확장시킬 수 있었습니다. 이렇게 상속할 때 많은 서브 클래스들이 만들어져 자원낭비를 할 수 있다는 단점이 있었는데 Kotlin에서는 상속이 아닌 함수 확장을 통해 기존 클래스의 기능을 쉽게 추가할 수 있게 하였습니다.

 

3. 함수형 프로그래밍

- 일종의 소프트웨어 개발 패러다임입니다.

이 부분에서 객체지향 프로그래밍인 Java보다 더 좋다 라고 비교할 수는 없지만

Kotlin은 함수형 프로그래밍으로써 기존에 있던 함수형 프로그래밍 언어보다 더 많은 프로그래밍 기법을 제공하고 있어 더 쉽게 사용할 수 있습니다.

 

4. data 클래스

- Spring Framework로 개발을 하는 저에게는 재미있는 부분인 것 같습니다.

data를 저장하기 위해 VO 클래스를 만들어 정의했어야 하나 만드는데 시간과 필요없는 코드를 소모했었는데 이를 짧게 작성할 수 있는 data 클래스를 제공해줍니다.

 

 

- 코틀린(Kotlin) 동향 분석(☆주목☆)

 

최근 구글(google)에 좋지 않은 소식이 들려왔습니다. 그 소식은 바로 '자바 라이센스 분쟁 소송' 이야기 입니다.

([참조] http://news.naver.com/main/read.nhn?mode=LSD&mid=sec&sid1=101&oid=001&aid=0009988737)

 

2009년 4월, Database 대표기업 오라클(Oracle)사가 Java언어를 만든 썬마이크로시스템즈사를 인수하게 되면서 안드로이드를 만든 구글에게 Java라이센스 소송을 시작하게 됩니다.

구글이 만든 안드로이드는 개발 언어가 Java이며 안드로이드 플랫폼을 구축하기 위해 오라클의 Java 오픈소스를 이용한 것이 저작권법 위반이라고 주장했기 때문입니다.

 

이 소송은 8년이란 시간동안 진행되어 왔으며 2018년 4월, 미국연방순회항소법원(CAFC)은 오라클을 손을 들어주며 구글은 '자바 라이센스 분쟁 소송'에서 패소와 90억달러(한화 약 11조)+a의 배상금을 지불해야 하는 상황이 되었습니다.

 

이는 앞으로의 안드로이드 생태계에 큰 영향을 미칠 것이라고 다수의 개발자들은 말합니다.

구글은 앞으로 안드로이드 개발에 있어 Java를 사용하려면 오라클사에 라이센스 비용을 지불해야 하고

2017년 5월에 구글이 Kotlin을 공식언어로 하였기에
안드로이드에 더 이상 Java를 사용할 이유가 없을 것이라 판단합니다.

 

이에 따라 현재 안드로이드하면 자연스럽게 Kotlin을 떠올리게 되었고

구글에서 안드로이드의 중심을 잡고있던 Java를 대체할 언어로 Kotlin이 될 것이라는 예측이 많습니다.

이는 앞으로 Kotlin을 주목해야 하는 이유라고 생각 합니다.

 

 

* 참고도서 및 사이트

- 코틀린 공식 사이트 https://kotlinlang.org

- 『깡쌤의 안드로이드 프로그래밍』, 강성윤

+ Recent posts