▸JAVA/기본 문법45 메소드 내 예외처리(try-catch-finally)에서의 리턴 처리 1. try 구문 내에서 리턴에 도달했을 경우 try 내에서 리턴에 정상적으로 도달하였으므로, 리턴시킬 값을 임시 저장한 뒤 바로 finally 문을 최종 실행시키고 메소드를 종료합니다. 실제 리턴은 finally문이 종료된 이후에 실행됩니다. 이경우에는 try-catch-finally 이후에 지정된 리턴문이 있어도 무시됩니다. 2. try 구문 내에서 return에 도달하지 못하고 예외 발생했을 경우 이경우에는 catch-finally문이 작동한 뒤, 이후 코드를 계속 실행해 나가다가 리턴값을 만나면 리턴해줍니다. 따라서 예외 발생 시에 리턴시킬 값을 지정할 때는 try-catch-finally문 바깥에 리턴문을 작성해주면 됩니다. finally안에서 리턴시키는 것은 경고가 뜨는데, 이는 만약 try문.. ▸JAVA/기본 문법 2020. 2. 23. 콜백(Callback) 패턴을 사용한 비동기 방식의 원리와 사용법 [ 콜백 (Callback) ] 피호출자(Callee)가 호출자(Caller)를 다시 호출하는 것 비동기적(Asynchronous) 처리를 하기 위한 디자인 패턴의 종류 자바에서 콜백 패턴을 다루는 방법에 대해 정리해 보았습니다. 간단해 보이는데 개념이 정확히 잡혀있지 않으면 꽤나 헷갈리는 패턴인 것 같습니다. 먼저 아래의 예시 상황을 한번 만들어보겠습니다. 클래스A는 채팅(하는척) 기능 담당하는 클래스이다. 채팅내용으로 "채팅을 하고 있습니다." 라는 문자열을 0.5초에 한번씩 화면에 출력한다. 채팅 문자열이 10개가 쌓이면 네트워크로 대용량 파일을 전송(하는척)한다. 클래스B는 파일 전송(하는척) 기능을 담당하는 클래스이다. 1~10까지의 숫자를 0.5초에 한번씩 전송(하는척)한다. 전송률이 40%,.. ▸JAVA/기본 문법 2020. 2. 7. 네트워크_NIO_논블로킹 채팅 서버/클라이언트 [3/3] 이전글에서 논블로킹 채팅 서버 및 클라이언트를 간단하게 만들어봤습니다. 글이 너무 길어져서 따로 코드만 첨부합니다. 코드 설명은 아래 링크를 참조하시면 됩니다. 2020/02/04 - [JAVA/기본 문법] - 네트워크_소켓(Socket) 통신_NIO 입출력(논블로킹) [2/3] 로직을 쉽게 보기 위해 객체화를 최대한 지양했습니다. [ 스레드를 사용하지 않는 논블로킹(non-blocking) 서버 코드 ] package hs; import java.io.IOException; import java.net.InetSocketAddress; import java.nio.ByteBuffer; import java.nio.channels.Channels; import java.nio.channels.Select.. ▸JAVA/기본 문법 2020. 2. 6. 네트워크_소켓(Socket) 통신_NIO 입출력(논블로킹) [2/3] [ NIO를 이용한 네트워크 입출력 - 논블로킹(non-blocking) 방식 ] 파일 입출력편에서 다룬 것 처럼 네트워크도 NIO를 통해 입출력을 수행할 수 있습니다. 스트림 계열의 경우 인풋과 아웃풋을 따로 만들어 관리해줘야 하지만 NIO의 채널을 이용하면 양방향 입출력 통로를 생성해서 사용할 수 있습니다. 또한 스트림 계열이 블로킹(blocking) 방식만 지원하는데 반해 NIO는 블로킹 방식에 더해 논블로킹(non-blocking) 방식을 추가로 지원하기 때문에 데이터 송수신양이 많을 경우 기존 스트림 계열보다 병렬처리를 더욱 효과적으로 할 수 있습니다. 블로킹(blocking) 방식이란 데이터 송수신을 기다리는 동안 해당 스레드가 대기 상태로 멈추는 것을 말합니다. 스레드편에서 다룬 블로킹과 동.. ▸JAVA/기본 문법 2020. 2. 4. 네트워크_소켓(Socket) 통신_IO 입출력 [1/3] [ 서버 소켓(ServerSocket) ] 서버에서 클라이언트의 연결 요청을 받기 위해 만들어두는 일종의 문(Door) 포트를 지정해 해당 서비스의 호수를 지정함 (여러 개 문이 있을 때 어느 문으로 들어가야할 지) [ 소켓(Socket) ] 네트워크를 통해 TCP/IP 통신을 연결시켜주는 객체 클라이언트와 서버가 연결된 상태를 만들어줌 (Session을 맺음) 자바에서 파일을 다룰 때 일단 파일을 열어서 파일 객체를 생성한 뒤 스트림이나 채널을 열어 input, output 작업을 수행하고 파일을 닫아줍니다. 네트워크 통신도 파일과 같다고 생각하면 됩니다. 소켓을 통해 서버-클라이언트 간 통신을 열어주는 것, 즉 세션을 맺어준 뒤 역시 스트림이나 채널을 열어 input, output 작업을 수행하면 됩.. ▸JAVA/기본 문법 2020. 2. 4. Thread (스레드)_스레드풀 [3/3] [ 스레드 풀 (Thread Pool) ] 미리 스레드를 생성해두고 재활용해가며 작업을 할당 미리 생성해둔 스레드를 모아둔 묶음을 스레드 풀이라고 함 이전 글들에서 다른 스레드는 각 스레드 당 하나의 run() 메소드를 가지고 있었습니다. 즉, 스레드를 하나 만들어서 실행하면 하나의 스레드는 한개의 로직(run)을 실행하게 됩니다. 그리고 이 로직이 끝나면 스레드는 종료되고 사라집니다. 스레드를 만든다는 것은 JVM이 운영체제(OS)에게 스레드 실행에 필요한 연산 자원(메모리 등)을 할당 받는다는 의미입니다. NIO의 바이트버퍼에서 일반 allocate()에 비해 allocateDirect()가 메모리 버퍼 생성과 해제에 더 시간이 많이 들었던 것처럼, 대부분 JVM 내에서 실행되는 것이 아니라 OS에 .. ▸JAVA/기본 문법 2020. 2. 1. Thread (스레드)_스레드 제어 [2/3] [ wait(), notify(), notifyAll() ] 스레드를 조금 더 세밀하게 제어할 수 있도록 해주는 메소드 동기화(Synchronized) 처리가 된 블록 안에만 사용이 가능 wait() : 스레드 상태를 RUNNABLE → WAITING 상태로 변경 notify() : WAITING 상태의 특정 스레드를 RUNNABLE 상태로 변경 notifyAll() : WAITING 상태의 모든 스레드를 RUNNABLE 상태로 변경 먼저 스레드의 상태 변경을 통해 원하는 조건에 스레드가 중지됐다 다시 가동하도록 하는 방법입니다. 아래 코드에서는 배열에 값이 하나도 없으면 Thread-1을 WAITING 상태로 만들었다가, 다른 스레드에서 배열에 값을 넣으면 notify() 메소드를 통해 Thread-1.. ▸JAVA/기본 문법 2020. 1. 30. Thread (스레드)_기본 스레드 사용 [1/3] [ Thread(스레드) ] 한 프로세스(프로그램 단위)에서 동시에 실행되는 작업 단위 동시에 여러 기능을 사용할 수 있도록 하거나 같은 기능을 여러 명이 동시에 사용할 수 있도록 해줌 프로그램은 항상 절차지향적인 순서대로 실행이 되는데 동시에 여러 절차를 수행할 수 있도록 하는 개념이 스레드의 개념입니다. 연산을 담당하는 CPU의 Core가 한 개라면 여러 스레드의 절차를 돌아가면서 조금씩 수행해 우리가 볼 때는 동시에 여러 로직이 실행되는 것처럼 보이게 됩니다. 4Core CPU라면 4개의 스레드를 동시에 사용해서 연산을 처리하는 것이 가장 좋은 방법이 될 수 있습니다. 만약 8개의 스레드를 사용하게 되면 8개 로직을 동시에 실행할 수 있지만 실질적인 성능이 증가하진 않습니다. 다만 모든 CPU와 스.. ▸JAVA/기본 문법 2020. 1. 30. 람다식(Lamdba Expressions) [ 람다식 문법 ] 익명 클래스를 구현하는 것과 유사한 방식 이전 방식에 비해 구현 코드를 간소화할 수 있음 람다식은 익명 클래스를 다루는 방식과 비슷합니다. 다만 문법을 조금 더 보기 편하게 간소화 시켜둔 것이라 볼 수 있습니다. 하지만 너무 남용할 경우 오히려 코드의 가시성이 떨어질 수 있으니 주의해야 합니다. 굳이 꼭 써야하는 문법은 아니며 사용에 대한 호불호도 많이 갈리는 문법입니다. 특히 객체지향적인 특성에서 많이 벗어나게되는 문법이라 싫어하는 사람들도 많은 것 같습니다. 다만 스트림 등의 특정 API에서는 람다식으로 작성해야 할 경우도 있습니다. 먼저 일반적인 익명 클래스 사용 예시입니다. 이전글에서 다룬 제네릭을 사용해서 내용이 없는 일종의 추상 메소드를 하나 만들고 사용 시에 바로 오버라이.. ▸JAVA/기본 문법 2019. 12. 23. 제네릭(generic) [ 제네릭(generic) ] 데이터 타입이 런타임 시점에 동적으로 결정되는 방식 가상의 데이터 타입을 사용하여 코드 작성 후 사용 시 타입 지정 컬렉션 프레임워크 글에서 간략이 언급했던 제네릭입니다. 리스트를 다룰 때 뿐만 아니라 매우 많은 부분에서 유용하게 쓸 수 있는 문법입니다. 매개변수 등의 전달 타입을 Object로 하는 것과 비슷하지만 더 활용성을 높이고 오류 가능성을 줄이는 방향으로 발전된 기능입니다. [ 제네릭 클래스 생성 ] class 클래스명 { } 꺽쇠기호 안에 가상 타입의 매개변수 이름(보통 T, V 등) 삽입 클래스 생성 시 가상의 타입을 사용해서 필드와 메소드를 만들어 둔 뒤, 실제 클래스를 이용할 때 타입을 지정해줍니다. 대표적인 예로 리스트를 생성할 때 어떤 데이터 타입의 리.. ▸JAVA/기본 문법 2019. 12. 23. 직렬화와 역직렬화 (Serializable) [ 직렬화 ] 자바의 객체를 외부 데이터로 저장하는 것 객체화된 클래스(인스턴스)의 속성과 데이터를 파일화하여 외부에 저장할 수 있음 [ 역직렬화 ] 직렬화로 저장된 파일을 다시 자바의 객체로 만드는 것 일종의 오버라이딩과 비슷한 개념 간단히 말하면 객체(보통 인스턴스를 의미)의 속성과 데이터를 모두 파일로 저장했다가 필요할 때 다시 객체로 되돌리는 기능이라고 볼 수 있습니다. 프로그램이 꺼지더라도 데이터는 보관되어 있으니 나중에 다시 불러와서 사용할 수 있게 됩니다. 또는 외부로 보내서 데이터를 공유할 수도 있습니다. 부모 클래스에서 물려받은 속성을 자식 클래스의 데이터로 덮어쓰는 오버라이딩과 비슷합니다. 아래에서 더 자세히 다루겠지만 공통된 속성을 가진 부모클래스로만 오버라이딩이 가능하듯이 역직렬화 .. ▸JAVA/기본 문법 2019. 12. 20. 외부 데이터 입출력_java.nio [3/3] [ java.nio 패키지 ] New IO라는 의미로 java.io의 업그레이드 버전 NIO2는 Java Se-7 버전에서 java.nio가 한 번 더 업그레이드 되었다는 의미 굳이 NIO1, NIO2의 구분 없이 그냥 NIO를 한통으로 생각하면 됨 [ 기존 Java.io와 차이점 ] 양방향 Channel 방식을 사용해 외부 데이터와 입출력 연동 (통로가 하나만 있으면 됨) 기본적으로 버퍼(Buffer)를 사용해 속도를 높임 (커널 버퍼를 직접 사용해서 입출력 속도 향상도 가능) 비동기 지원 (메소드 호출 시점과 결과 출력 시점이 다름) Non-Blocking 지원 (I/O를 수행하는 동안 스레드가 놀지 않도록(block 당하지 않도록) 함) NIO는 어렵습니다. NIO만 정리해도 책이 한권 나올 것 같.. ▸JAVA/기본 문법 2019. 12. 16. 외부 데이터 입출력_java.io [2/3] [ java.io 패키지 ] 아직도 많이 사용되고 있는 구버전의 입출력 패키지 java.nio(New IO, NIO)와 함께 병행해서 사용되고 있음 간단한 입출력의 경우 NIO보다 더 효율적일 수 있음 알게 모르게 항상 사용하게 되는 패키지입니다. NIO가 있긴 하지만 간단한 상황에서는 오히려 더 효과적일 수 있기 때문에 정확한 개념을 알아두는 것이 좋습니다. 외부 데이터와의 연동은 프로그램 성능에 큰 영향을 미칠 수 있습니다. 아래 글은 파일 입출력을 예제로 하였습니다. 스트림을 이용한 네트워크 입출력은 아래 링크글을 참조하시면 됩니다. 2020/02/04 - [JAVA/기본 문법] - 네트워크_소켓(Socket) 통신_IO 입출력 [1/3] [ File 클래스 ] 파일의 위치 정보를 가지고 있음 파일.. ▸JAVA/기본 문법 2019. 12. 16. 외부 데이터 입출력_io / nio / nio2 [1/3] Java에서 프로그램과 외부의 데이터(디스크, 네트워크, 메모리 등)를 연결해서 조작할 수 있게 해주는 클래스가 너무 많습니다. 구버전과 신버전으로 나눌 수 있는데 아직까지 구버전도 많이 쓰이는데다가 각각 장단점이 있어서 둘 모두를 적절히 알고 사용해야할 것 같습니다. 먼저 구버전은 java.io 패키지입니다. 신버전은 Java SE-4에서 처음 나와(NIO) 7에서 한번 더 업그레이드 된(NIO2) java.nio라는 패키지입니다. 굳이 NIO1, NIO2로 나눠서 생각하지 않아도 됩니다. 그냥 (Old)IO와 (New)IO라고 생각하면 됩니다. 워낙 클래스도 많고 방대해서 중점적인 부분만 다루도록 하겠습니다. 전체적인 구조와 원리만 알면 상황에 따라 적절한 클래스를 찾아서 사용하면 됩니다. [ IO와.. ▸JAVA/기본 문법 2019. 12. 16. 예외(Exception) 처리하기_사용자 정의 예외 객체(throw) [5/5] [ 사용자 정의 예외 객체 ] 기본 라이브러리(API)에서 제공하는 예외 객체 외 개발자가 선언해서 사용하는 예외 객체 Exception클래스 또는 Exception의 자식 클래스를 반드시 상속받아야 함 일반적으로 Exception에서 선언된 형태의 생성자 외에는 다른 멤버를 가지지 않음 즉 Exception을 상속받는 예외 객체를 직접 만들고, 조건문을 사용해서 특정 상황에서 예외를 강제로 발생하도록 만들어 줍니다. 사실 이 경우 조건문이기 때문에 굳이 예외 객체를 생성하지 않더라도 처리하고 싶은 예외 상황을 조건문으로 처리하거나, 예외 객체 대신 그냥 메소드로 생성해서 사용할 수도 있습니다. 다만 명시적인 예외 객체를 사용하므로써 코드의 가시성을 높일 수 있습니다. 아래는 일반 메소드로 예외 처리를 .. ▸JAVA/기본 문법 2019. 12. 13. 이전 1 2 3 다음 💲 추천 글 반응형