세이브를 이용한 자동 import 문 생성하기
·
자바/팁
1. 세이브를 이용한 자동 import 문 생성하기 - 일반적으로 코드를 작성할 때 import 문이 없다고 아래의 사진처럼 빨간줄로 에러 메시지를 준다. - 이렇게 되면 아주 귀찮게 하나하나씩 다 import를 해 줘야 한다. - 이럴 때 해결방법은 [CTRL + S] 즉, 세이브 버튼을 누를 때 import 문을 자동으로 생성하게 하는 것이다. - 해당 기능을 가능하게 할려면 아래의 사진처럼 저 빨간색 네모상자에 있는 버튼을 활성화를 해야한다. * [Java] -> [Editor] -> [Save Actions] -> [Organize imports] - 이제 설정이 완료되면 빨간줄이 발생했을 때 [CTRL + S]를 눌러 import 문을 추가해보자.
자동 완성 힌트
·
자바/팁
1. 자동 완성 힌트 주기 - 보통 코드를 쓸 때 자신이 선언한 변수나 해당 클래스의 함수, 변수를 이용하지만, 일일이 이름을 다 외우면서 사용하지는 않는다. - 그러므로 다들 한 번씩은 자신이 선언한 변수명을 보러가거나 예전에 사용했던 클래스의 함수명, 변수명을 인터넷 또는 서적을 참고할 때가 있다. - 그렇게 되면 시간을 잡아먹게 된다. 이러한 것을 해결하기 위해서는 "자동 완성 힌트" 기능을 이용하는 것이다. 아래의 사진을 보고 한 번 따라해보자. (1) 먼저 툴에 있는 [Window] 클릭 -> [Preferences] 클릭 (2) 그러면 아래의 창이 나오게 되는데 [Java] 클릭 -> [Editor] 클릭 -> [Content Assist] 클릭 하여 아래의 버튼들을 활성화 (3) 그리고 맨 ..
열겨형의 전반적인 개념(3)
·
자바/열거형(enums)
5. 열거형의 구조 - 아래와 같이 Direction이라는 열거형을 정의되었다고 가정해보자. enum Direction{ EAST, SOUTH, WEST, NORTH }; ( 이 열거형 Direction은 사실 상수 하나하나가 Direction 객체이다. ) ( 그러므로, 위의 문장을 클래스로 정의하면 아래의 코드가 된다. ) class Direction{ static final Direction EAST = new Direction("EAST"); static final Direction SOUTH = new Direction("SOUTH"); static final Direction WEST = new Direction("WEST"); static final Direction NORTH = new D..
열겨형의 전반적인 개념(2)
·
자바/열거형(enums)
3. 열거형에 멤버 추가하기 - ordinal()은 열거형 상수가 정의된 순서를 반환하지만, 이 값을 열거형 상수의 값으로 사용하지 않는 것이 좋다. 그 이유는 그 값들은 내부적인 용도로만 사용하기 때문이다. - 만약 상수의 값들이 불연속적이라면, 그냥 상수 멤버 옆에 '()'을 사용하여 값을 넣어주며 된다. enum Direction{ EAST(5), SOUTH(1), WEST(-1), NORTH(0) }; - 또한 지정된 값을 저장할 수 있는 인스턴스 변수와 생성자를 새로 추가해 주어야 한다. enum Direction{ EAST(1), SOUTH(5), WEST(-1), NORTH(10); // 끝에 ; private final int value; // 인스턴스 변수 추가 Direction(int ..
열겨형의 전반적인 개념(1)
·
자바/열거형(enums)
1. 열거형이란? - 열겨형은 서로 관련된 상수를 편리하게 선언하기 위한 것으로 여러 상수를 정의할 때 사용하면 유용하다. - 아래의 코드를 통해 원래의 코드와 enum을 적용한 코드의 비교를 통해 이해하자. class Card{ static final int CLOVER = 0; static final int HEART = 1; static final int DIAMOND = 2; static final int SPADE = 3; static final int TWO = 0; static final int THREE = 1; static final int FOUR = 2; final int kind; final int num; } class CARD{ enum Kind ..
지네릭 타입의 형변환과 제거
·
자바/지네릭스
1. 지네릭 타입과 원시 타입의 형변환 - 아래의 코드처럼 지네릭 타입과 원시 타입의 형변환은 항상 가능하지만, 경고가 발생한다. Box box = null; Box objBox = null; box = (Box) objBox; // 지네릭 타입 -> 원시 타입 (경고 발생) objBox = (Box) box; // 원시 타입 -> 지네릭 타입 (경고 발생) - 단, 아래의 코드처럼 대입된 타입이 다른 지네릭 타입 간에는 형변환이 불가능하다. Box objBox = null; Box strBox = null; objBox = (Box) strBox; // 에러 발생 strBox = (Box) objBox; // 에러 발생 - 그러므로, 아래의 코드처럼 지네릭으로는 다른 지네릭으로 형변환할 수 없다. Bo..
지네릭 메서드
·
자바/지네릭스
1. 지네릭 메서드란? - 메서드의 선언부에 지네릭 타입이 선언된 메서드를 '지네릭 메서드' 라고 부른다. - 앞서 했던 예제 메서드 Collections.sort() 또한 지네릭 메서드이다. - 지네릭 클래스에 정의된 타입 매개변수와 지네릭 메서드에 정의된 타입 매개변수는 전혀 별개의 것이다. - 아래의 코드를 통해 이해하자. class FruitBox{ ... static void sort(List list, Comparator
와일드 카드
·
자바/지네릭스
1. 와일드 카드란? - Juicer라는 클래스가 존재하고 static 메서드로 makeJuice()가 있다고 가정해보자. class Juicer{ static Juice makeJuice(FruitBox box) { // 으로 지정 String tmp = ""; for(Fruit f : box.getList()) tmp += f + " "; return new Juice(tmp); } } ( Juice 클래스는 지네릭 클래스가 아닌데다, 지네릭 클래스라고 해도 static 메서드에는 타입 매개변수 T를 매개변수에 사용할 수 없으므로 아예 지네릭스를 적용하지 않던가, 위와 같이 같이 로 지정해줘야 한다. ) ( 그래서 아래와 같이 fruitBox는 컴파일이 잘 되지만, appleBox에 대해서는 컴파일 ..
지네릭스의 전반적 개념(2)
·
자바/지네릭스
5. 제한된 지네릭 클래스 - 타입 문자로 사용할 타입을 명시하면 한 종류의 타입만 저장할 수 있도록 제한할 수는 있지만, 그래도 여전히 아래의 코드처럼 모든 종류의 타입을 저장할 수 있다는 것에는 변함이 없다. FruitBox fruitBox = new FruitBox(); fruitBox.add(new Toy()); // 과일상자에 장난감을 담을 수 있다? ( 이러한 것을 해결하기 위해서는 class 이름 뒤에 아래와 같이 지네릭 타입을 주면 된다. ) class FruitBox{// Fruit의 자손만 타입으로 지정가능 ArrayList list = new ArrayList(); ... } public class Exercise002{ public static void main(String[] ar..
지네릭스의 전반적 개념(1)
·
자바/지네릭스
1. 지네릭스란? - 지네릭스는 다양한 타입의 객체들을 다루는 메서드나 컬렉션 클래스에 대해서 타입 체크를 해주는 기능을 말한다. - 그러므로, 객체의 타입 안정성을 높이고 형변환의 번거로움을 줄어든다. - 타입 안정성을 높이는 것은 의도치 않은 타입의 객체가 저장되는 것을 막고, 저장된 객체를 꺼내올 때 원래의 타입과 다른 타입으로 잘못 형변환되어 발생할 수 있는 오류를 줄여준다는 뜻이다. - 예를 들면, ArrayList 컬렉션 클래스에 다양한 객체를 담을 수 있지만 한 종류의 객체를 담는 경우가 많다. 그런데도 꺼낼 때 마다 타입 체킹을 하거나 사용자가 원하지 않는 종류의 객체를 저장하는 것을 막지 못하는 불편한 점이 있다. 그러한 것을 해결할 수 있는 것이 바로 '지네릭스'이다. - 아래는 지네릭..
fork & join 프레임웍
·
자바/프로세스와 쓰레드
1. fork & join 프레임웍 - 이 프레임웍은 하나의 작업을 작은 단위로 나눠서 여러 쓰레드가 동시에 처리하는 것을 쉽게 만들어 준다. - 수행할 적업에 따라 두 클래스로 나눠지는데, 상속받아 구현해야 한다. 클래스 설명 RecursiveAction 반환값이 없는 작업을 구현할 때 사용 RecursiveTask 반환값이 있는 작업을 구현할 때 사용 public abstract class RecursiveAction extends ForkJoinTask{ ... protected abstract void compute(); // 상속을 통해 이 메서드를 구현해야 한다. ... } public abstract class RecursiveTask extends ForkJoinTask{ ... V res..
volatile
·
자바/프로세스와 쓰레드
1. volatile - 메모리 값과 캐시 값과의 차이가 발생할 때 volatile을 사용한다. - 이 volatile은 싱글 코어 프로세서에서는 문제가 발생하지 않으므로 쓰일 곳이 없지만, 멀티 코어 프로세서에서 많이 쓰일 것이다. 그 이유는 멀티코어 프로세서마다 각 캐시가 존재하기 때문이다. - 코어는 메모리에서 읽어온 값을 캐시에 저장하고 캐시에서 값을 읽어서 빠르게 작업한다. 그러다보니, 값을 읽어올 때 캐시에 값이 존재하는지 확인하고 없을 때에만 메모리에 가서 값을 읽어온다. - 만약 코어가 메모리에 값이 변경되었는데도 캐시 값을 쓰인다면, 의도와 다른 값을 가질 수 있다. - 그러나 캐시에 사용되는 변수 앞에 volatile을 쓴다면, 코어가 캐시가 아닌 메모리에 가서 읽어오기 때문에 해결할 ..
쓰레드의 동기화(3): Lock과 Condition을 이용한 동기화
·
자바/프로세스와 쓰레드
1. Lock 클래스 - synchronized 블럭 외에도 'java.util.concurrent.locks' 패키지가 제공하는 lock 클래스들을 이용하는 방법이 있다. - synchronized 블럭으로 동기화를 하면 자동적으로 lock이 잠기고 풀리며 심지어 예외가 발생하여도 lock은 자동으로 풀린다. - 그러나, 같은 메서드 내에서만 lock을 걸 수 있다는 제약이 있어서 불편할 때가 있다. - 그럴 때 아래와 같은 lock 클래스의 종류 3가지를 사용한다. 클래스 설명 ReentrantLcok 재진입이 가능한 lock, 가장 일반적인 배타 lock ReentrantReadWriteLock 읽기에는 공유적이고, 쓰기에는 배타적인 lock StampedLock ReentrantReadWriteL..
쓰레드의 동기화(2): wait() & notify()
·
자바/프로세스와 쓰레드
1. wait()와 notify() - 동기화도 중요하지만, 특정 쓰레드가 객체의 락을 가진 상태로 오랜 시간을 보내지 않도록 하는 것 또한 중요하다. - 이러한 것을 구현하기 위해 wait()와 notify()가 등장하게 되었다. - CS을 수행하다가 작업을 더 이상 진행할 상황이 아니면 wait() 호출을 하여 L을 반납한다. ( 이때, 대기하고 있는 쓰레드는 객체의 대기실(waiting pool)에서 통지를 기다린다. ) - wait() 호출 후, 나중에 작업을 진행할 수 있는 상황이 되면 notify()를 호출해서 다시 L을 얻는다. ( notify()를 통해 통지를 waiting pool에 하면, 모든 쓰레드 중에서 임의의 쓰레드만 통지를 받는다. ) ( notifiyAll()은 기다리고 있는 ..
쓰레드의 동기화(1): Critical Section & Lock, snychronized
·
자바/프로세스와 쓰레드
1. Critical Section과 Lock - 싱글 쓰레드 프로세스의 경우 하나의 쓰레드가 자원을 가지고 작업하기 때문에 별 문제가 없지만, 멀티 쓰레드 프로세스의 경우 같은 프로세스 내의 자원을 공유해서 작업하기 때문에 서로 영향을 주게 된다. - 쓰레드 A,B가 있다고 가정해보자. 쓰레드 A가 공유 데이터를 작업하는 도중 쓰레드 B가 제어권을 얻어 공유데이터를 변경하게 된다면, 사용자는 다른 결과를 얻게 될 것이다. - 이러한 일이 발생하는 것을 방지하기 위해서 한 쓰레드가 작업을 끝마치기 전까지 다른 쓰레드에 의해 방해받지 않도록 하는 것이 필요하다. - 그래서 도입된 개념이 바로 Critical Section과 Lock이다. ( 앞으로 간단하게 부르기 위해 전자는 CS를 후자는 L이라고 지칭한..
소켓 프로그래밍: TCP와 UDP(4)
·
자바/네트워킹
1. UDP 소켓 프로그래밍 - TCP 소켓 프로그래밍에서는 Socket과 ServerSocket을 사용하지만, UDP 소켓 프로그래밍에서는 DatagramSocket과 DatagramPacket을 사용한다. - UDP는 비연결지향적인 프로토콜이라서 ServerSocket이 필요하지 않다. - DatagramSocket은 UDP의 소켓이며, 데이터를 DatagramPacket에 담아서 전송한다. - DatagramPacket은 헤더와 데이터로 구성되어 있으며, 보통 헤더는 수신할 호스트의 정보(호스트의 주소, 포트)가 저장되어 있다. 1-1. UDP 소켓 프로그래밍을 이해하기 위한 예제(1) ( 아래는 서버 프로그램이다. ) package Networking; import java.io.IOExcepti..
소켓 프로그래밍: TCP와 UDP(3)
·
자바/네트워킹
3-6. 소켓 프로그래밍을 이해하기 위한 예제(6) : 채팅 프로그램을 만드는 예제이다. ( 아래는 서버 프로그램이다. ) package Networking; import java.io.DataInputStream; import java.io.DataOutputStream; import java.io.IOException; import java.net.ServerSocket; import java.net.Socket; import java.util.Scanner; public class Exercise011 { public static void main(String[] args) { ServerSocket serverSocket = null; Socket socket = null; try { // 서버소..
소켓 프로그래밍: TCP와 UDP(2)
·
자바/네트워킹
3-3. 소켓 프로그래밍을 이해하기 위한 예제(3) : 예제(2)에서 했던 코드를 Socekt 클래스에 정의된 getPort()와 getLocalPort()로 수정한 예제이다. package Networking; import java.net.*; import java.io.*; import java.util.Date; import java.text.SimpleDateFormat; public class Exercise008 { public static void main(String args[]) { ServerSocket serverSocket = null; try { // 서버소켓을 생성하여 7777번 포트와 결합(bind)시킨다. serverSocket = new ServerSocket(7777); ..
소켓 프로그래밍: TCP와 UDP(1)
·
자바/네트워킹
1. 소켓 프로그래밍이란? - 소켓 프로그래밍은 소켓을 이용한 통신 프로그래밍을 뜻한다. - 소켓이란 프로세스간의 통신에 사용되는 양쪽 끝단을 의미한다. - 자바에서는 java.net 패키지를 통해 소켓 프로그래밍을 지원하는데, 소켓 통신에 사용되는 프로토콜에 따라 다른 종류의 소켓을 구현하여 제공한다. 2. TCP와 UDP - TCP/IP 프로토콜은 이기종 시스템간의 통신을 위한 표준 프로토콜로 프로토콜의 집합이다. - TCP와 UDP 모두 TCP/IP 프로토콜에 포함되어 있으며, OSI 7계층의 전송계층에 해당된다. - TCP와 UDP의 장단점은 아래와 같다. 항목 TCP UDP 연결방식 connection-oriented - 연결 후 통신(ex 전화기) - 1:1 통신 방식 connectionles..
네트워킹(Networking) (2) - URL, URLConnection
·
자바/네트워킹
5. URL (Uniform Resource Locator) - URL은 인터넷에 존재하는 여러 서버들이 제공하는 자원에 접근할 수 있는 주소를 표현하기 위한 것이다. - 형식은 '프로토콜://호스트명:포트번호/경로명/파일명?쿼리스트링#참조'의 형태로 이루어져 있다. ( URL에서 포트번호, 쿼리, 참조는 생략가능함. ) - 아래는 URL의 형식에 있는 각 단어의 개념을 설명한다. (1) 프로토콜 : 자원에 접근하기 위해 서버와 통신하는데 사용되는 통신규약 ( ex) HTTP ) (2) 호스트명 : 자원을 제공하는 서버의 이름 ( ex) www.dasdw.com ) (3) 포트번호 : 통신에 사용되는 서버의 포트번호 ( ex) 80 ) (4) 경로명 : 접근하려는 자언이 저장된 서버상의 위치 ( ex) ..
네트워킹(Networking) (1) - InetAddress
·
자바/네트워킹
1. 네트워킹의 개념 - 네트워킹이란 두 대 이상의 컴퓨터를 케이블로 연결하여 네트워크를 구성하는 것을 말한다. - 자바에서 제공하는 java.net 패키지를 사용하면 이러한 네트워크 어플리케이션의 데이터 통신 부분을 단 몇 줄의 자바 코드만으로도 쉽게 작성할 수 있다. - 아래 2번부터는 간단한 네트워크 기본 개념을 다룰 것이므로, 가볍게 읽고 넘어가자. 2. 클라이언트/서버 - 클라이언트는 서비스를 사용하는 컴퓨터(Service User)이다. - 서버는 서비스를 제공하는 컴퓨터(Service Provider)이다. - 서버가 서비스를 제공하기 위해서는 서버 프로그램이 있어야 하고, 클라언트가 서비를 제공받기 위해서 서버 프로그램과 연결할 수 있는 클라이언트 프로그램이 있어야 한다. - 클라이언트는 ..
직렬화가 가능한 클래스 만들기 - Serializable, transient (2)
·
자바/입출력 IO
참고) 아래의 예제에서 사용될 UserInfo 클래스는 아래와 같다. package Serialization; public class UserInfo implements java.io.Serializable { String name; String password; int age; public UserInfo() { this("Unknown", "1111", 0); } public UserInfo(String name, String password, int age) { this.name = name; this.password = password; this.age = age; } public String toString() { return "("+ name + "," + password + "," + age..
직렬화가 가능한 클래스 만들기 - Serializable, transient (1)
·
자바/입출력 IO
1. 직렬화가 가능한 클래스를 만드는 방법 - 직렬화하고자 하는 클래스가 java.io.Serializable 인터페이스를 구현하도록 하면 된다. - 그저 아래 코드처럼 따로 구현할 필요없이 implements만 해주면 된다. public class UserInfo implements java.io.Serializable{ } - 또한 아래의 코드처럼 조상이 implements를 통해 직렬화하였다면, 자손도 직렬화가 가능하다. public class SuperInfo implements java.io.Serializable{ } public class UserInfo extends SuperInfo{ } - 그러나, 아래의 코드처럼 조상님의 인스턴스 변수(name, password)는 직렬화 대상에서 제..
직렬화(Serializtion): Object 입출력 스트림
·
자바/입출력 IO
1. 직렬화 - 직렬화(Serializtion)란? 객체를 데이터 스트림으로 만드는 것을 말한다. - 즉, 객체에 저장된 데이터를 스트림에 쓰기 위해 연속적인 데이터로 변환하는 것이다. - 반대로 스트림으로부터 데이터를 읽어서 객체를 만드는 것을 역직렬화(deserialization) 라고 한다. 2. ObjectInputStream과 ObjectOutputStream - 직렬화는 ObjectOutputStream을, 역직렬화는 ObjectInputStream을 사용한다. - ObjectInputStream과 ObjectOutputStream은 InputStream과 OutputStream을 직접 상속받지만, 기반 스트림을 필요로 하는 보조 스트림이다. - 그래서 객체를 생성할 때, 기반(주) 스트림을 ..
표준 입출력과 File: File(4)
·
자바/입출력 IO
1-10. File을 이해하기 위한 예제(10) : 지정된 파일을 지정된 크기(KB)만큼 자르는 예제이다. package File; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.IOException; import java.util.Scanner; public class Exercise010 { public static void main(String[] args) { String[] input = new String[2]; Scanner sc = new Scanner(System...
표준 입출력과 File: File(3)
·
자바/입출력 IO
1-7. File을 이해하기 위한 예제(7) : 해당 디렉토리에 입력된 문자열과 일치한 파일의 목록을 보여주는 예제이다. package File; import java.io.File; import java.io.FilenameFilter; import java.util.Scanner; public class Exercise007 { public static void main(String args[]) { Scanner sc = new Scanner(System.in); String input = sc.nextLine(); if(input == null) { System.out.println("USAGE : java FileEx7 pattern"); System.exit(0); } String currDi..
표준 입출력과 File: File(2)
·
자바/입출력 IO
1-3. File을 이해하기 위한 예제(3) : 1-2 예제(2)에서 했던 코드에 추가로 서브 디렉토리의 파일과 디렉토리까지 보여주는 예제이다. package File; import java.io.File; import java.util.ArrayList; import java.util.Scanner; public class Exercise003 { static int totalFiles = 0; static int totalDirs = 0; public static void main(String[] args) { Scanner sc = new Scanner(System.in); String input = sc.nextLine(); if(input == null) { System.out.println("..
표준 입출력과 File: File(1)
·
자바/입출력 IO
1. File - 입출력에 대한 가장 기본적이면서도 가장 많이 사용되는 입출력 대상이기 때문에 중요하다. - 아래는 File에 대한 생성자/메서드를 설명한다. : 중요한 부분만 다뤘다. 자세한 내용은 915p를 참고한다. (1) File(String fileName) : 주어진 문자열을 이름으로 갖는 파일을 위한 File 인스턴스를 생성한다. : 여기서 fileName은 파일 이름만 사용해도 되는데 이 경우 프로그램이 실행되는 위치가 경로로 간주된다. (2) File(URI uri) : 지정된 uri로 파일 생성 (3) File(String pathName, String fileName) 또는 File(File pathName, String fileName) : 파일의 경로와 이름을 따로 분리해서 지정할..
표준 입출력과 File: RandomAccessFile
·
자바/입출력 IO
1. RandomAccessFile - 자바에서는 입력과 출력이 각각 분리되어 별도로 작업을 하도록 설계되어 있는데, 이 RandomAccessFile만은 하나의 클래스로 입력과 출력을 모두 할 수 있도록 되어 있다. - RandomAccessFile은 InputSteam과 OutputStream으로부터 상속받지 않고, DataInput 인터페이스와 DataOutput 인터페이스를 모두 구현했기 때문에 읽기와 쓰기가 모두 가능하다. - RandomAccessFile 클래스의 가장 큰 장점은 파일의 어느 위치에나 읽기/쓰기가 가능하다는 것이다. ( 다른 입출력 클래스들은 입출력 소스에 순착적으로 읽기/쓰기를 하기 때문에 읽기와 쓰기가 제한적이다. ) - 그러므로, RandomAccessFile 클래스는 어..
표준 입출력과 File: System(in, out, err)
·
자바/입출력 IO
1. 표준 입출력 - System.in, System.out, System.err - 자바에서는 System.in, System.out, System.err을 제공하는데, 자바 어플리케이션의 실행과 동시에 사용할 수 있게 자동적으로 생성되기 때문에 개발자가 별도로 스트림을 생성하는 코드를 작성하지 않고도 사용 가능하다. - in, out, err는 System에 정의된 클래스(static) 변수이다. - 아래의 코드처럼 InputStream과 PrintStream이 선언부로 되어있지만, 사실 BufferedInputStream과 BufferedOutputStream의 인스턴스를 사용한다. public final class System{ public final static InputStream in = n..