1. Thread 클래스와 Runnable 인터페이스 프로세스(Process) 프로세스는 단순히 실행 중인 프로그램을 말한다. 프로그램을 실행하면 운영체제에 의해 메모리 공간을 할당받아 프로세스가 된다. 프로세스는 프로그램을 수행하는 데 필요한 데이터와 메모리 등의 자원과 쓰레드로 구성되어 있다. 쓰레드(Thread) 쓰레드는 프로세스의 자원을 이용해서 실제로 작업을 수행하는 주체를 말한다. 모든 프로세스는 최소한 하나 이상의 쓰레드가 존재한다. 쓰레드가 하나면 싱글쓰레드 프로세스, 둘 이상의 쓰레드를 가진 프로세스를 멀티쓰레드 프로세스(multi-threaded process)라고 한다. 멀티 태스킹(multi-tasking, 다중작업) 여러 개의 프로세스가 동시에 실행될 수 있는 것을 말하며, 대부분..
자바 프로그램을 사용하다가 프로그램이 비정상적으로 종료될 때가 있다. 이런 원인을 에러(Error)라고 한다. 에러는 컴파일 에러와 런타임 에러로 구분할 수 있다. 컴파일 에러는 컴파일 과정에서 발생하는 에러, 런타임 에러는 실행(런타임) 과정에서 발생하는 에러를 말한다. 컴파일 에러는 기본적으로 자바 컴파일러가 문법 검사를 통해 에러를 잡아내주기 때문에 , 그 에러를 수정하면 프로그램을 실행할 수 있다. 런타임 에러는 컴파일 시에 에러가 발생하지 않더라도 실행(런타임) 과정에서 에러가 발생하는 것을 말한다. 런타임 에러를 막기 위해서는 프로그램 실행 과정에서 일어날 수 있는 에러의 경우의 수를 모두 고려해 방지해야 한다. 자바에서 런타임 에러를 에러(Error)와 예외(Exception) 두가지로 구분..
LinkedList ArrayList와는 하나의 큰 배열을 사용하는 방식이다. 이와는 다르게 LinkedList는 각각의 노드를 연결하는 방식을 사용한다. 연결 리스트로 구현되어 있고 각각의 데이터는 노드(Node)로 구성되어 연결되어 있는 구조다. 각 노드는 데이터와 다음 노드의 값을 가지고 있다. LinkedList의 장점은 데이터 삽입/삭제가 용이하다는 점이다. 원하는 위치 어디에서나 삽입/삭제 시에 변경되는 노드만 다시 연결해주면 되기 때문에 빠른 연산이 가능하다. LinkedList에서의 삽입 과정 LinkedList에서의 삭제 과정 그래서 데이터의 삽입/삭제가 자주 발생하는 경우에 LinkedList를 사용하는 것이 좋다. 그러나, LinkedList는 순차접근만 가능하기 때문에 인덱스를 이용..
1. JVM이란? JVM은 자바 가상 머신으로 Java Virtual Machine의 줄임말이다. Java는 운영체제(OS)에 구애받지 않고 실행할 수 있는데 , JVM이 그 역할을 한다. 자바 프로그램은 컴퓨터가 이해할 수 있는 언어(기계어)인 바이너리코드가 아닌 바이트코드(가상 머신이 이해할 수 있는 코드)로 되어 있다. 여기서 JVM의 필요성을 알 수 있다. 기계어는 cpu의 제조사마다 달라서 하나의 언어가 아니다. 다 다른 컴퓨터 환경에서 실행하려면 각각의 제조사에 맞는 기계어를 알고 있어야 한다. 그렇지만 개발자가 모든 종류의 cpu의 기계어를 알고 있기에 매우 번거롭다. 그래서 JVM이 자바 프로그램을 다양한 cpu 환경에서 이식성 문제 없이 실행할 수 있도록 도와주는 역할을 하는 것이다. 이..
톰캣서버를 사용해 JSP와 Servlet을 배우고 있다. 웹페이지로 Servlet 출력을 하는데, 원하지 않는 출력이 나타나거나 브라우저마다 다른 출력이 나타나거나 한글이 깨지는 현상들이 일어나곤 한다. 왜그럴까? 형식들을 지정하지 않았기 때문이다. 여러 형식들을 지정해서 그에 맞게끔 브라우저가 읽어들이도록 해야한다. 1. Servlet 출력 형식 일단, 아래 코드부터 보자. @WebServlet("/HelloServlet") public class Hello extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IO..
Stream (스트림) 스트림은 자바8부터 추가된 컬렉션의 저장 요소를 하나씩 참조해서 람다식으로 처리할 수 있도록 해주는 반복자이다. 데이터 컬렉션 반복을 멋지게 처리하는 기능이라고 생각하면 이해가 쉽다. Iterator와 비슷한 역할을 하지만 람다식으로 처리하기 때문에 코드를 좀 더 간결하게 할 수 있으며, 내부 반복자를 사용하므로 병렬처리가 쉽다는 점에서 차이가 있다. Iterator를 이용해 ArrayList의 요소를 모두 처리하기 위한 방법은 다음과 같다. ArrayList arrayList = new ArrayList(Arrays.asList(1,2,3)); Iterator iter = arrayList.iterator(); while(iter.hasNext()) { int num = iter..
Collection(컬렉션) : 데이터의 집합, 그룹 Java Collections Framework는 이러한 데이터, 자료구조인 컬렉션과 이를 구현하는 클래스를 정의하는 인터페이스를 제공한다. 개발에 소요되는 시간을 절약하면서 최적화된 알고리즘을 사용할 수 있다. Java Collection Framework 의 상속구조 Collection 인터페이스에 선언된 주요 메서드 메서드 설명 boolean add(E e) Collection에 객체를 추가 void clear() Collection의 모든 객체 제거 Iterator iterator Collection을 순환할 반복자(Iterator)를 반환 boolean remove(Object o) Collection에 매개변수에 해당하는 인스턴스가 존재할 ..
자바를 사용하다보면 abstract 와 interface 의 기능과 차이가 헷갈릴 때가 많다. 그래서 정리를 해보고자 글을 쓰게 되었다. abstract (추상클래스) 추상클래스는 0개/하나 이상의 추상메소드를 가지고 있다. 추상메소드는 추상메소드는 함수의 바디가 아직 구현되어 있지 않은 abstract로 정의된 메소드를 말한다. public abstract class Car { /* 추상 메소드 */ public abstract void drive(); public abstract void stop(); /* 일반 메소드 */ public void startCar() { System.out.println("시동을 켭니다"); } } public class AICar extends Car{ @Overri..