프로그래스바를 이용하여 진행도 알려주기
·
안드로이드 with 자바/응용 문제들
0. 응용한 기술 - 해당 섹션이 완료되면, 그 섹션만큼 진행도를 증가시키는 것. ( 여기서는 섹션을 sleep()을 주었다. ) ( 구현하고 싶다면, sleep()을 진행시키고 여러 쓰레드를 수행하면 된다. ) 1. 구현해야 할 것 2. 제약조건 - 없음. 3. java 소스코드 ( 아래는 MainActivity.java의 코드이다. ) package com.example.exercise001; import android.app.ProgressDialog; import android.content.Context; import android.os.Bundle; import android.os.Handler; import android.os.Looper; import android.view.View; im..
열겨형의 전반적인 개념(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에 대해서는 컴파일 ..
BitmapDrawable을 통한 스크롤 뷰 구현
·
안드로이드 with 자바/자잘한 문제들
1. 구현해야 할 것 2. 제약조건 (1) imageView 하나를 써서 BitmapDrawable로 구현할 것. (2) 수평으로 스크롤 뷰를 만들 것. (3) 버튼을 누를 경우, 위와 같은 이미지가 나오며 수평으로 스크롤이 가능해야 함. (4) 다시 버튼을 누를 경우, 다른 이미지가 등장하게 됨. ( 또 버튼을 누르면 다시 원래 첫 이미지로 돌아가게 되면서 무한 반복함. ) 3. java 소스코드 ( 아래는 MainActivity.java의 코드이다. ) package com.example.exercise001; import android.content.res.Resources; import android.graphics.drawable.BitmapDrawable; import android.os.Bu..
지네릭스의 전반적 개념(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..