네트워크 프로그래밍(network programming)은 여러 장치(컴퓨터들)에서 실행되며, 이 장치들이 네트워크를 사용하여 모두 서로 연결된 프로그램들을 작성하는 것을 의미합니다. J2SE API의 java.net 패키지에는 저수준 통신 세부사항을 제공하는 클래스들과 인터페이스들의 모음이 들어 있어, 당면한 문제 해결에 집중하는 프로그램들을 작성할 수 있게 합니다. java.net 패키지는 두 가지 일반적인 네트워크 프로토콜을 지원합니다. TCP - Transmission Control Protocol의 약자로, 두 애
자바는 객체 직렬화(object serialization)라는 메커니즘을 제공합니다. 여기서 객체는 객체의 데이터뿐만 아니라 객체 타입과 객체에 저장된 데이터 타입들에 대한 정보를 포함하는 바이트 시퀀스로 표현될 수 있습니다. 직렬화된 객체가 파일에 쓰여진 후, 파일에서 읽어와 역직렬화(deserialized)할 수 있습니다. 즉, 타입 정보와 객체 및 데이터를 나타내는 바이트들을 사용하여 메모리에서 객체를 재생성할 수 있습니다. 가장 인상적인 점은 이 전체 과정이 JVM 독립적이라는 것입니다. 즉, 한 플랫폼에서 객체를 직렬화
단일 정렬 메서드를 작성하여 Integer 배열, String 배열, 또는 순서를 지원하는 어떤 타입의 배열이든 정렬할 수 있다면 좋을 것입니다. 자바 제네릭(Generic) 메서드와 제네릭 클래스는 프로그래머가 단일 메서드 선언으로 관련 메서드 집합을, 단일 클래스 선언으로 관련 타입 집합을 각각 지정할 수 있게 합니다. 제네릭은 컴파일 타임 타입 안전성을 제공하여 프로그래머가 잘못된 타입을 컴파일 시점에 잡을 수 있게 합니다. 자바 제네릭 개념을 사용하면 객체 배열을 정렬하는 제네릭 메서드를 작성한 뒤, Integer 배열
자바 2 이전에는 Dictionary, Vector, Stack, Properties 같은 임시 클래스들을 제공하여 객체 그룹을 저장하고 조작했습니다. 이 클래스들이 꽤 유용했지만, 중앙의 통합된 테마가 없었습니다. 따라서 Vector 사용법이 Properties 사용법과 달랐습니다. 컬렉션 프레임워크는 여러 목표를 충족하도록 설계되었습니다. 프레임워크는 고성능이어야 함. 기본 컬렉션(동적 배열, 연결 리스트, 트리, 해시테이블) 구현들이 고도로 효율적이어야 함 서로 다른 타입의 컬렉션들이 유사한 방식으로 작동하고 높은
자바 유틸리티 패키지에서 제공하는 자료구조들은 매우 강력하며 광범위한 기능을 수행합니다. 이 자료구조들은 다음 인터페이스와 클래들로 구성됩니다. Enumeration BitSet Vector Stack Dictionary Hashtable Properties 이 모든 클래스들은 이제 레거시(legacy)이며, 자바 2에서 새로운 프레임워크인 컬렉션 프레임워크(Collections Framework)를 도입했는데, 이는 다음 장에서 다룹니다. Enumeration Enumeration 인터페이스는 그
자바에서 패키지는 이름 충돌 방지, 접근 제어, 클래스/인터페이스/열거형/애노테이션의 검색·위치 파악·사용 용이성을 위해 사용됩니다. 패키지(Package)는 관련 타입들(클래스, 인터페이스, 열거형, 애노테이션)을 그룹화하여 접근 보호와 네임스페이스 관리를 제공하는 것으로 정의할 수 있습니다. 자바의 기존 패키지들: java.lang - 기본 클래스들 번들 java.io - 입출력 기능 클래스들 번들 프로그래머는 직접 패키지를 정의하여 클래스/인터페이스 등을 그룹화할 수 있습니다. 직접 구현한 관련 클래스들을 그룹
인터페이스는 자바에서 참조 타입입니다. 클래스와 유사합니다. 추상 메서드들의 모음입니다. 클래스가 인터페이스를 구현하면 인터페이스의 추상 메서드들을 상속받습니다. 추상 메서드 외에도 인터페이스에는 상수, 디폴트 메서드, 정적 메서드, 중첩 타입이 포함될 수 있습니다. 메서드 본문은 디폴트 메서드와 정적 메서드에만 존재합니다. 인터페이스 작성은 클래스 작성과 유사합니다. 하지만 클래스는 객체의 속성과 행동을 설명합니다. 인터페이스는 클래스가 구현하는 행동들을 포함합니다. 인터페이스를 구현하는 클래스가 추상이 아닌 한, 인터페이스
캡슐화(Encapsulation)는 네 가지 기본 OOP 개념 중 하나입니다. 나머지 세 가지는 상속, 다형성, 추상화입니다. 자바에서 캡슐화는 데이터(변수)와 데이터를 다루는 코드(메서드)를 단일 단위로 감싸는 메커니즘입니다. 캡슐화에서 클래스의 변수들은 다른 클래스들로부터 숨겨지며, 오직 자신의 클래스 메서드를 통해서만 접근할 수 있습니다. 따라서 데이터 은닉(data hiding)이라고도 합니다. 자바에서 캡슐화를 달성하려면: 클래스의 변수들을 private으로 선언 변수 값을 수정하고 조회할 수 있는 public
사전적 의미로 추상화(abstraction)는 사건보다는 아이디어를 다루는 성질입니다. 예를 들어 이메일을 보낼 때, 이메일을 보내는 순간 무슨 일이 일어나는지, 이메일 서버가 어떤 프로토콜을 사용하는지 같은 복잡한 세부사항은 사용자에게 숨겨져 있습니다. 따라서 이메일을 보내려면 내용만 적고 수신자 주소를 적은 뒤 보내기만 누르면 됩니다. 마찬가지로 객체지향 프로그래밍에서 추상화는 구현 세부사항을 사용자로부터 숨기고 기능만 제공하는 과정입니다. 즉, 사용자는 객체가 무엇을 하는지 알지만 어떻게 하는지는 모릅니다. 자바에서는 추상
다형성(Polymorphism)은 객체가 여러 형태를 취할 수 있는 능력입니다. OOP에서 다형성이 가장 흔히 사용되는 경우는 부모 클래스 참조가 자식 클래스 객체를 참조할 때입니다. 두 개 이상의 IS-A 테스트를 통과할 수 있는 자바 객체는 다형적(polymorphic)이라고 간주됩니다. 자바에서 모든 자바 객체는 다형적입니다. 어떤 객체든 자신의 타입과 Object 클래스에 대해 IS-A 테스트를 통과하기 때문입니다. 객체에 접근하는 유일한 방법은 참조 변수를 통하는 것임을 아는 것이 중요합니다. 참조 변수는 오직 한 가지
이전 장에서 슈퍼클래스와 서브클래스에 대해 다뤘습니다. 클래스가 슈퍼클래스에서 메서드를 상속받으면, 그 메서드가 final로 표시되지 않은 한 오버라이드할 수 있습니다. 오버라이딩의 이점: 서브클래스 타입에 특화된 동작을 정의할 수 있어, 서브클래스가 부모 클래스 메서드를 자신의 요구사항에 맞게 구현할 수 있습니다. 객체지향 용어로 오버라이딩은 기존 메서드의 기능을 재정의하는 것을 의미합니다. 예제 예제를 살펴봅시다. class Animal { public void move() { System.out.pr
상속은 한 클래스가 다른 클래스의 속성(메서드와 필드)을 획득하는 과정으로 정의할 수 있습니다. 상속을 사용하면 정보를 계층적 순서로 관리하기 쉽게 만듭니다. 다른 클래스의 속성을 상속받는 클래스를 서브클래스(subclass, 파생 클래스, 자식 클래스), 속성이 상속되는 클래스를 슈퍼클래스(superclass, 베이스 클래스, 부모 클래스)라고 합니다. extends 키워드 extends는 클래스의 속성을 상속받는 데 사용되는 키워드입니다. extends 키워드 구문은 다음과 같습니다. 구문 class Super {
이 장에서는 자바의 내부 클래스(inner classes)에 대해 다룹니다. 중첩 클래스(Nested Classes) 자바에서는 메서드처럼 클래스의 변수도 다른 클래스를 멤버로 가질 수 있습니다. 클래스 안에 클래스를 작성하는 것이 허용됩니다. 안에 작성된 클래스를 중첩 클래스(nested class), 내부 클래스를 감싸는 클래스를 외부 클래스(outer class)라고 합니다. 구문 중첩 클래스 작성 구문입니다. 여기서 Outer_Demo가 외부 클래스이고 Inner_Demo가 중첩 클래스입니다. class Outer_Dem
예외(또는 예외적 이벤트)는 프로그램 실행 중에 발생하는 문제입니다. 예외(Exception)가 발생하면 프로그램의 정상적인 흐름이 중단되고 프로그램이 비정상적으로 종료되는데, 이는 권장되지 않으므로 이러한 예외들을 처리해야 합니다. 예외는 다양한 이유로 발생할 수 있습니다. 예외가 발생하는 몇 가지 시나리오: 사용자가 잘못된 데이터를 입력함 열어야 할 파일을 찾을 수 없음 통신 중 네트워크 연결이 끊기거나 JVM 메모리가 부족함 이 중 일부는 사용자 실수, 일부는 프로그래머 실수, 일부는 물리적 자원 고장으로 인
java.io 패키지에는 자바에서 입력과 출력(I/O)을 수행하는 데 필요한 거의 모든 클래스가 들어 있습니다. 이 모든 스트림은 입력 소스와 출력 대상을 나타냅니다. java.io 패키지의 스트림은 기본 타입, 객체, 지역화된 문자 등 다양한 데이터를 지원합니다. 스트림(Stream) 스트림은 데이터의 연속적인 흐름으로 정의할 수 있습니다. 스트림에는 두 가지 종류가 있습니다. InputStream - 소스에서 데이터를 읽는 데 사용 OutputStream - 대상으로 데이터를 쓰는 데 사용 자바는 파일 및 네트워
자바 메서드는 특정 연산을 수행하기 위해 함께 그룹화된 문장들의 모음입니다. 예를 들어 System.out.println() 메서드를 호출하면 시스템은 콘솔에 메시지를 표시하기 위해 여러 문장을 순서대로 실행합니다. 이제 반환 값이 있는 메서드와 없는 메서드를 생성하고, 매개변수가 있는 메서드와 없는 메서드를 호출하며, 프로그램 설계에 메서드 추상화를 적용하는 방법을 배워보겠습니다. 메서드 생성하기 메서드 구문을 설명하기 위해 다음 예제를 살펴보겠습니다. 구문 public static int methodName(int a, i
자바는 정규 표현식을 이용한 패턴 매칭을 위해 java.util.regex 패키지를 제공합니다. 자바 정규 표현식은 펄(Perl) 프로그래밍 언어의 것과 매우 유사하며 배우기 쉽습니다. 정규 표현식이란? 정규 표현식은 특수한 문자 시퀀스로, 패턴에 담긴 특수 구문을 사용하여 다른 문자열이나 문자열 집합을 매칭하거나 찾는 데 도움을 줍니다. 텍스트와 데이터를 검색, 편집, 조작하는 데 사용할 수 있습니다. java.util.regex 핵심 클래스 java.util.regex 패키지는 주로 다음 세 가지 클래스로 구성됩니다.
Java는 java.util 패키지에서 Date 클래스를 제공하며, 이 클래스는 현재 날짜와 시간을 캡슐화합니다. Date 클래스는 다음 표와 같이 두 가지 생성자를 지원합니다. 번호 생성자 & 설명 1 Date( ) 현재 날짜와 시간으로 객체 초기화. 2 Date(long millisec) 1970년 1월 1일 자정부터 경과한 밀리초 수와 같은 인자 수용. 다음은 Date 클래스의 메서드들입니다. 번호 메서드
Java는 배열이라는 데이터 구조를 제공하며, 이는 같은 타입의 요소들을 고정된 크기의 순차적 컬렉션으로 저장합니다. 배열은 데이터 컬렉션을 저장하는 데 사용되지만, 같은 타입의 변수 컬렉션으로 생각하는 것이 더 유용합니다. number0, number1, ..., number99 같은 개별 변수들을 선언하는 대신, numbers 같은 하나의 배열 변수를 선언하고 numbers[0], numbers[1], ..., numbers[99]로 개별 변수들을 표현합니다. 이 튜토리얼에서는 배열 변수 선언, 배열 생성, 인덱스 변수를 사
Java 프로그래밍에서 널리 사용되는 문자열은 문자 시퀀스입니다. Java 프로그래밍 언어에서 문자열은 객체로 취급됩니다. Java 플랫폼은 문자열 생성과 조작을 위한 String 클래스를 제공합니다. 문자열 생성 문자열을 생성하는 가장 직접적인 방법은 다음과 같이 쓰는 것입니다: String greeting = Hello world!; 코드에서 문자열 리터럴을 만날 때마다 컴파일러는 이 경우 Hello world!라는 값으로 String 객체를 생성합니다. 다른 객체처럼 new 키워드와 생성자를 사용하여 String 객체
java