From 9b3eba4b6e35473fb4876bade2d646cc3dc988f2 Mon Sep 17 00:00:00 2001 From: Seogeurim Date: Tue, 12 Jan 2021 23:49:05 +0900 Subject: [PATCH 1/9] =?UTF-8?q?[Java]=20java=20overview=20=EC=9D=B4?= =?UTF-8?q?=EB=A1=A0=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/language/java/README.md | 73 ++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 contents/language/java/README.md diff --git a/contents/language/java/README.md b/contents/language/java/README.md new file mode 100644 index 0000000..5dabc85 --- /dev/null +++ b/contents/language/java/README.md @@ -0,0 +1,73 @@ +# Java + +> 작성자 : [서그림](https://github.com/Seogeurim) + +## Java Overview + +### Java 언어의 탄생 배경 + +#### 썬마이크로시스템즈의 Green Project에서 시작 + +Green Project에서는 가정용 전자기기의 통합적 제어를 위해, 전자기기에서 사용되는 작은 컴퓨터 언어를 제안했다. 가정용 전자기기에 사용되는 power나 memory가 열악했기 때문에 여기에 사용되는 언어는 작고 견고하고, 신뢰할 수 있는 코드를 필요로 했다. 또한 다른 CPU가 선택될 수 있기 때문에 특정 디바이스에 종속되면 안 되었다. 따라서 **Virtual Machine에서 동작하는 중간 코드를 생성하여 이식성이 높은 언어를 디자인**하게 되었다. + +초기에는 절차 지향 + 객체 지향 언어인 C++ 기반으로 개발되었다. 하지만 C++ 언어가 가진 한계에 부딪혀 **완벽한 객체 지향 언어**인 Oak 언어를 개발하였고, 이미 존재하는 이름이라 추후 **Java**로 이름이 바뀌게 되었다. + +그 후 Java를 기반으로 한 HotJava라는 웹 브라우저를 제작하였는데, Java의 Applet 이라는 기능을 보여주기 위해 브라우저가 중간 코드(Bytecode)를 해석할 수 있도록 만들었다. 이 때 자바 붐이 일어나 Java 언어가 급격히 확산되었다. 이후 많은 업체들이 Java를 지원하기 시작하였고, 1996년 자바 2 플랫폼이라고 명명되었던 자바 버전 1.2가 출시되었다. 그리고 현재까지 많은 버전들이 출시되고 있다. + +### Java 특징 + +1. **단순 (Simple)** + C(절차 지향) + C++(객체 지향) 언어를 기초로 하지만, C언어의 복잡한 기능을 제외하여 코드를 단순하게 작성할 수 있다. 특히 가비지 컬렉터(Garbage Collector)에 의한 자동 메모리 관리로 할당된 메모리 해제를 신경쓰지 않아도 된다. +2. **객체지향 (Object-Oriented)** + 자바는 객체 지향 언어로, 언어라는 객체를 사용해 프로그램을 작성하도록 한다. 이로써 **재사용성(Reusability)** 을 높일 수 있다. 코드의 재사용, 객체의 재사용 뿐만 아니라 수많은 클래스 라이브러리들을 API로 제공함으로서 재사용성을 높이고 있다. +3. **분산 처리 (Distributed)** + Java는 분산 환경에서 TCP/IP 등의 프로토콜을 통해 효율적으로 실행할 수 있도록 설계된 언어이다. Java는 다음을 지원한다. + - TCP/IP 네트워크 기능 내장 + - HTTP, FTP 등과 같은 프로토콜에 대한 라이브러리 제공 + - 서로 다른 컴퓨터 상의 객체들도 원격으로 호출하여 실행할 수 있는 원격 메서드 호출과 관련된 RMI(Remote Method Invocation) 기능의 라이브러리 제공 +4. **인터프리터 (Interpreter)** + 프로그래밍 언어는 인터프리터 언어, 컴파일 언어로 나뉜다. 자바는 **컴파일 언어인 동시에 인터프리터 언어**이며, 인터프리터에 의해 실행된다. 자바 프로그램은 다음과 같은 실행 과정을 거친다. + - 소스코드(.java) ▶︎ **컴파일(Compile): javac** ▶︎ 중간코드(.class): 바이트 코드, 클래스 파일 ▶︎ **기계어로 해석(Interprete): java** ▶︎ 실행 +5. **견고 (Robust)** + 다양한 플랫폼(컴퓨터) 상에서 실행되기 위해서는 **높은 신뢰성**이 중요하다. 자바는 다음과 같은 기능들을 지원함으로서 높은 신뢰성을 구현하였다. + - 포인터를 사용하지 않음 + - 가비지 컬렉션(Garbage Collector) 기능 + - 엄격한 데이터 타입의 검사 : 에러 조기 발견 + - Runtime 에러 처리 +6. **안전 (Secure)** + 컴파일 시 엄격한 검사를 통해 프로그램 실행 시 발생할 수 있는 장애를 미리 방지한다. 소스코드가 컴파일된 .class 형태의 바이트코드는 **클래스 로더**, **바이트 코드 검증기**를 거친다. 이 때 문제가 없으면 인터프리터로 넘겨 실행하게 된다. + - 클래스 로더 : 코드가 자신/다른 컴퓨터에서 온 것인지 판단하고 **코드를 분리**한다. + - 바이트 코드 검증기 : **코드를 검증**하여 문제가 없을 시 인터프리터로 넘긴다. +7. **플랫폼 독립적 (Architecture Neutral)** + 운영체제, CPU 등의 **하드웨어 사양에 관계 없이 실행**될 수 있다. 작성된 자바 프로프램은 자바 컴파일러를 거쳐 자바 가상 머신에서 기계어로 번역되게 된다. 번역된 기계어 코드는 하드웨어 사양에 관계 없이 동일하게 실행된다. +8. **높은 성능 (High Performance)** + **가비지 컬렉션(Garbage Collection) 기능**이 추가되어 있어 자동으로 메모리 관리가 가능하다. 이는 메모리가 할당된 객체의 상태를 추적하여 더 이상 참조되지 않으면 자동으로 할당된 메모리를 해제하여 불필요한 메모리 낭비를 방지하는 기능이다. +9. **멀티스레드 (Multithread)** + 자바는 멀티스레드를 지원한다. 이는 한 번에 여러 개의 스레드가 동시에 수행되는 과정으로, 하나의 CPU가 여러 프로그램을 동시에 수행하도록 함으로서 수행 속도를 빠르게 한다. +10. **동적 (Dynamic)** + 자바는 변화되는 환경에 잘 적응하도록 설계된 언어이다. 따라서 기존의 프로그램에 영향을 주지 않고 라이브러리에 새로운 메서드나 속성들을 추가할 수 있으며, 프로그램 간 라이브러리의 연결을 Runtime에 수행함으로써 라이브러리의 변화를 곧바로 적용할 수 있다. + +### Java 플랫폼 + +플랫폼(Platform)이란, 프로그램이 실행될 수 있는 HW 및 SW 환경을 의미한다. + +일반적인 플랫폼은 하드웨어 및 하드웨어를 제어하는 운영체제로 구성되어 있지만, 자바 플랫폼은 소프트웨어만으로 구성된다. 자바 플랫폼은 일반적으로 JDK(Java Development Kit)라는 툴로 설치된다. + +#### 자바 플랫폼의 종류 + +- **Java SE (Java 2 Platform Standard Edition)** + 가장 기본이 되는 에디션, 자바 언어 대부분의 패키지가 포함된다. +- **Java EE (Java 2 Platform Enterprise Edition)** + 현업에서 사용되는 API들이 집약된 에디션이다. (JSP, Servlet, JDBC 등) +- **Java ME (Java 2 Platform Micro Edition)** + 모바일 기기 등에서 사용되는 API가 포함된 에디션이다. + +#### 자바 플랫폼의 구조 + +자바 프로그램은 **자바 가상 머신** 위에서 동작한다. 자바 가상 머신에는 **자바 API** (자바 프로그램을 작성하는 데 기본적으로 활용할 수 있는 클래스 라이브러리, 즉 표준 API 라이브러리)가 제공된다. + +![image](https://user-images.githubusercontent.com/22045163/104326478-20603f80-552d-11eb-8845-4a6bf5218570.png) + +**자바 가상 머신(JVM, Java Virtual Machine)** 은 자바 프로그램과 운영체제 중간에 존재하여 서로를 분리함으로써, 애플리케이션이 운영체제에 영향 받지 않고 동작할 수 있는 환경을 제공한다. 단, JVM은 운영체제와 직접적으로 통신을 해야 하기 때문에 운영체제에 맞는 JVM을 설치해주어야 한다. + +**자바 API(Application Programming Interface)** 는 프로그래머가 필요로 하는 기본적인 클래스(Class)들을 거대한 라이브러리로 미리 만들어서 제공한다. 자바 언어 자체는 작고 단순한 구조를 갖지만, 많은 기능들을 API에서 제공하고 있다. 자바 API는 관련된 기능의 클래스들을 묶어 패키지의 형태로 제공한다. _(주요 패키지 : java.applet, java.awt, java.io, java.lang, java.net, javax.swing, java.util)_ From a393dafd5c284939994791412172efd61782e323 Mon Sep 17 00:00:00 2001 From: Seogeurim Date: Wed, 13 Jan 2021 01:02:17 +0900 Subject: [PATCH 2/9] =?UTF-8?q?[Java]=20java=20basic=20=EC=9D=B4=EB=A1=A0?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/language/java/README.md | 96 ++++++++++++++++++++++++++++++++ 1 file changed, 96 insertions(+) diff --git a/contents/language/java/README.md b/contents/language/java/README.md index 5dabc85..9e8d190 100644 --- a/contents/language/java/README.md +++ b/contents/language/java/README.md @@ -71,3 +71,99 @@ Green Project에서는 가정용 전자기기의 통합적 제어를 위해, 전 **자바 가상 머신(JVM, Java Virtual Machine)** 은 자바 프로그램과 운영체제 중간에 존재하여 서로를 분리함으로써, 애플리케이션이 운영체제에 영향 받지 않고 동작할 수 있는 환경을 제공한다. 단, JVM은 운영체제와 직접적으로 통신을 해야 하기 때문에 운영체제에 맞는 JVM을 설치해주어야 한다. **자바 API(Application Programming Interface)** 는 프로그래머가 필요로 하는 기본적인 클래스(Class)들을 거대한 라이브러리로 미리 만들어서 제공한다. 자바 언어 자체는 작고 단순한 구조를 갖지만, 많은 기능들을 API에서 제공하고 있다. 자바 API는 관련된 기능의 클래스들을 묶어 패키지의 형태로 제공한다. _(주요 패키지 : java.applet, java.awt, java.io, java.lang, java.net, javax.swing, java.util)_ + +## Java 언어의 구조와 기본 문법 + +### Java 프로그램 구조 + +- **자바 클래스(class)** 는 자바 프로그램의 최소 구성 단위로, 선언된 클래스 내부에 실행에 필요한 변수나 메서드 등이 정의된다. 일반적으로 자바 프로그램은 하나의 `.java` 파일에 하나의 클래스 정의를 원칙으로 한다. +- **자바 애플리케이션** 은 바이트 코드로 번역된 후에 바로 실행할 수 있는 프로그램이다. 클래스 내에 `main()` 메서드를 가지고 있어야 한다. +- 자바는 **블록(`{}`)** 으로 자바 문장들의 집합을 표현한다. 블록의 시작과 끝이 짝을 이루지 않으면 컴파일 오류가 발생하며, 클래스, 메서드, 자바 구문(`if`, `for`, `try-catch` 등)에 사용된다. +- 자바 문장은 **세미콜론(`;`)** 을 사용해 문장들을 구분한다. + +```java +public class 클래스명 { + // 변수 정의 + // 메서드 정의 + public static void main(String args[]) { + // 실행될 프로그램 코드 + } +} +``` + +### Java 데이터 타입과 변수 + +- **데이터 타입**은 데이터의 성격을 규정한다. +- 사용할 데이터를 **변수**에 저장하고 관리함으로써 데이터의 의미를 정확하게 해석하여 사용할 수 있다. + +### 데이터 타입 + +| 표현형태 | 데이터 타입 | 크기 | 표현 범위 | (자동 초기화 시) 초기값 | +| :-------: | :---------: | :-----------: | :-------------------------------: | :---------------------: | +| 논릿값 | boolean | 1bit | true/false | false | +| 단일 문자 | char | 16bit (2byte) | `'\u0000'` ~ `'\uffff'` | `'\u0000'` (Null) | +| 정수 | byte | 8bit (1byte) | -2^7 ~ 2^7-1 (-128 ~ 127) | 0 | +| 정수 | short | 16bit (2byte) | -2^15 ~ 2^15-1 (-32768 ~ 32767) | 0 | +| 정수 | int | 32bit (4byte) | -2^31 ~ 2^31-1 (약 -21억 ~ 21억) | 0 | +| 정수 | long | 64bit (8byte) | -2^63 ~ 2^63-1 | 0L | +| 실수 | float | 32bit (4byte) | 1.4E-45 ~ 3.4028235E38 | 0.0F | +| 실수 | double | 64bit (8byte) | 4.9E-324 ~ 1.7976931348623157E308 | 0.0D | + +\* 정수 : 부호가 있는 정수, 형을 명시하지 않으면 `int`가 기본형 +\* 실수 : 부호가 있는 부동소수점 실수, 형을 명시하지 않으면 `double`이 기본형 +_(부동소수점이란, 컴퓨터가 소수점이 포함된 실수를 표현하는 방식 중 하나이다. 이는 고정소수점과 달리 소수점을 자유로이 움직일 수 있어서 표현할 수 있는 수의 범위가 매우 넓다는 장점이 있다.)_ +\* 초기화 : 메서드(함수) 안에서 선언된 변수인 지역변수는 자동으로 초기화되지 않는다. +\* 참조형(Reference Type) 변수의 초기값 : `null` + +#### 데이터 타입의 범위 초과 시 발생하는 오류 + +- 컴파일 오류 : **변수 초기화 시** 범위를 초과하는 경우 발생 +- 런타임 오류 : **연산 결과**로 범위를 초과하는 경우 발생 + +#### 데이터 타입의 변환, 형변환 + +변수의 타입을 다른 타입으로 변경하고자 할 때, **형변환 연산자**를 사용해 변환할 수 있다. 작은 데이터 타입에서 큰 데이터 타입으로 변환하는 것을 **묵시적 형변환(Promotion)**, 그 반대를 **명시적 형변환(Demotion)** 이라고 한다. + +- **묵시적 형변환(Promotion)** : 데이터 손실의 우려가 없어 자동 캐스팅 가능하다. **(자동 형변환)** + + ```java + int age = 25; + double avgAge = age; // double avgAge = (double)age; + ``` + + - 위와 같이 형변환 연산자인 `(double)`을 생략할 수 있다. + - 단, 다음의 규칙에 따라 자동 형변환이 이루어진다. + - byte -> short -> int -> long -> float -> double 순 + - char -> int -> long -> float -> double 순 + +- **명시적 형변환(Demotion)** : 더 작은 범위를 나타내는 데이터 타입으로 변환하기 때문에 데이터 손실의 우려가 있어 명시적 캐스팅이 필요하다. **(축소 형변환)** + + ```java + double avgAge = 24.56; + int age = (int)avgAge; + ``` + + - 위와 같이 형변환 연산자를 명시해주어야 한다. + - 단, 데이터 타입이 축소되어 변환된 후에도 해당 값을 표현할 수 있어야 한다. 다음은 올바르지 못한 예이다. + + ```java + int sum = 128 + byte data = (byte)sum // -128 + ``` + +### 변수 + +- 변수는 컴퓨터 내부의 데이터와 1:1 대응되어 변수를 통해 메모리상의 데이터에 접근 가능하다. +- 기본형(Primitive Type)과 참조형(Reference Type) 두 가지 변수가 존재한다. +- 전역(Global) 변수와 지역(Local) 변수로 선언할 수 있다. +- 변수는 자신이 속한 블록({})을 벗어나면 사용이 불가하다. + +#### 전역(Global) 변수와 지역(Local) 변수 + +- **전역(Global) 변수** : 클래스 선언부 밑에 선언된 변수로, 여러 메서드에서 공통으로 사용할 수 있다. +- **지역(Local) 변수** : 메서드 선언부 밑 또는 메서드 매개변수로 선언된 변수로, 해당 변수가 선언된 메서드 내에서만 사용 가능하다. + +#### 변수 선언 + +- 자바 가상 머신(JVM)에게 데이터를 저장하기 위한 메모리 할당을 요청하는 것이다. +- 데이터가 필요로 하는 크기의 메모리 할당을 위해 데이터 타입을 명시해야 한다. From cf16a1bc9ed527ddd8984e4a85b5747e98a13084 Mon Sep 17 00:00:00 2001 From: Seogeurim Date: Wed, 13 Jan 2021 01:46:52 +0900 Subject: [PATCH 3/9] =?UTF-8?q?[Java]=20java=20basic=20=EC=9D=B4=EB=A1=A0?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/language/java/README.md | 80 ++++++++++++++++++++++++++++++++ 1 file changed, 80 insertions(+) diff --git a/contents/language/java/README.md b/contents/language/java/README.md index 9e8d190..e4042b5 100644 --- a/contents/language/java/README.md +++ b/contents/language/java/README.md @@ -167,3 +167,83 @@ _(부동소수점이란, 컴퓨터가 소수점이 포함된 실수를 표현하 - 자바 가상 머신(JVM)에게 데이터를 저장하기 위한 메모리 할당을 요청하는 것이다. - 데이터가 필요로 하는 크기의 메모리 할당을 위해 데이터 타입을 명시해야 한다. + +## Java 연산자 및 배열 + +### Java 연산자 + +#### 산술 연산자 + +- 정수형, 실수형에 사용됨 +- 증감 연산자 : `++`, `--` (단항) +- 부호 연산자 : `+`, `-`, `*`, `/` (이항) +- 나머지 연산자 : `%` (이항) + +#### 비교 연산자 + +- 대소 비교나 객체의 타입 비교 등에 사용됨 +- 비교 연산을 수행한 결과로 `boolean` 타입의 결과를 리턴함 +- `>`, `>=`, `<`, `<=`, `==`, `!=`, `instanceof` + - `값1 instanceof 값2` : `값1`이 `값2` 데이터 타입의 객체인 경우 `true` 반환 + +#### 논리 연산자 + +- `boolean` 데이터 타입에 적용되며, `boolean` 타입의 결과를 리턴함 +- `&`, `&&`, `|`, `||`, `!` + - `값1 && 값2`, `값1 || 값2` 의 경우, `값1`이 `false`인 경우 `값2`를 수행하지 않고 `false`를 리턴한다. + +#### 비트 연산자 + +- 값을 비트(bit)로 연산하는 연산자 +- 메모리를 최대한 효율적으로 활용해야 하는 경우 비트 단위로 데이터를 관리해야 한다. +- `&` 논리곱(and), `|` 논리합(or), `^` 배타 논리합(exclusive or, XOR), `~` 보수(not) +- `>>`, `>>>`, `<<` 시프트 + - `값1 >> 값2` : `값1`을 비트 단위로 `값2`의 비트 수만큼 오른쪽으로 시프트, 왼쪽에는 현재 부호 비트가 채워짐 + - `값1 >>> 값2` : `값1`을 비트 단위로 `값2`의 비트 수만큼 오른쪽으로 시프트, 왼쪽에는 0이 채워짐 + - `값1 << 값2` : `값1`을 비트 단위로 `값2`의 비트 수만큼 왼쪽으로 시프트, 오른쪽에는 0이 채워짐 + +#### 기타 연산자 + +- 대입 연산자 (`=`) : 변수의 값을 저장, 오른쪽의 값을 왼쪽에 대입 +- 조건 삼항 연산자 (`? :`) : `if~else`문을 축약하여 사용할 수 있다. + - `변수 = 조건 ? 값1 : 값2` : 조건이 참이면 `값1`이 변수에 대입되고, 거짓이면 `값2`가 변수에 대입된다. + +### Java의 배열 + +배열은 같은 타입의 데이터들의 모임으로, 메모리가 절약되고, 쉽고 간결하게 프로그램을 작성할 수 있다. + +#### 일차원 배열의 선언과 사용 + +- 배열 객체를 참조할 배열 변수 선언 ▶︎ 배열 객체 생성 + - 배열 변수 선언 : `데이터타입 배열변수명[];` 또는 `데이터타입[] 배열변수명;` + - 배열 객체 생성 : `배열변수명 = new 데이터타입[배열의 길이];` + - 두 구문을 합쳐 한 문장으로 표현 가능 + +#### 이차원 배열 + +- 다차원 배열 : 일차원 배열을 여러 개 사용하여 다시 배열을 구현한 것, 즉 배열의 배열 +- 배열의 크기를 나타내는 배열 첨자(`[]`)를 차수에 따라 추가하면 된다. +- 배열 객체를 참조할 배열 변수 선언 ▶︎ 배열 객체 생성 + - 배열 변수 선언 : `데이터타입 배열변수명 [][];` 또는 `데이터타입[][] 배열변수명;` 또는 `데이터타입[] 배열변수명 [];` + - 배열 객체 생성 : `배열변수명 = new 데이터타입[배열의 배열 길이][배열 길이];` 또는 + `배열변수명 = new 데이터타입[배열의 배열 길이][]; 배열변수명[인덱스 번호] = new 데이터타입[배열 길이];` + +#### 명령행 매개변수 + +`main()` 메서드란, 자바 애플리케이션에 필수적으로 포함되어야 하는 메서드로, 애플리케이션이 실행될 때 자동으로 실행된다. 일반적으로 자바 애플리케이션은 `main()` 메서드 내에서 다른 클래스 객체를 생성하고, 그 객체의 메서드 호출 또는 변수 조작 과정을 통해 원하는 결과를 얻는다. + +```java +public class CommandLineArgTest { + public static void main(String args[]) { + // code + } +} +``` + +위 코드의 `main()` 메서드를 살펴보면 `String args[]`라는 매개변수를 볼 수 있는데, 이를 **명령행 매개변수**라고 한다. 명령행 매개변수는 문자열 배열을 매개변수로 받아, 프로그램 실행 시 필요한 정보를 프로그램에 전달한다. + +- String 데이터 타입의 배열이다. +- 사용자가 입력한 문자열의 순서에 따라 차례로 배열에 저장된다. +- 공백을 구분자로 여러 개의 값을 전달할 수 있다. +- 문자열 타입이므로 숫자를 입력했을 시 문자열을 숫자로 변환해야 한다. + - 자바 API에서 메서드 제공 : Integer 클래스의 `parseInt()`, Double 클래스의 `parseDouble()` From 2b1a375278017752442a6de43f23e585afb915c3 Mon Sep 17 00:00:00 2001 From: Seogeurim Date: Wed, 13 Jan 2021 01:56:13 +0900 Subject: [PATCH 4/9] =?UTF-8?q?[java]=20java=20basic=20=EC=9D=B4=EB=A1=A0?= =?UTF-8?q?=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/language/README.md | 4 +++- contents/language/java/README.md | 6 ++++++ 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/contents/language/README.md b/contents/language/README.md index be55a7a..49f2c6f 100644 --- a/contents/language/README.md +++ b/contents/language/README.md @@ -1,5 +1,7 @@ # Language -## Java +## [Java](./java) + +- Java Overview & Basic ## C++ diff --git a/contents/language/java/README.md b/contents/language/java/README.md index e4042b5..6b73204 100644 --- a/contents/language/java/README.md +++ b/contents/language/java/README.md @@ -247,3 +247,9 @@ public class CommandLineArgTest { - 공백을 구분자로 여러 개의 값을 전달할 수 있다. - 문자열 타입이므로 숫자를 입력했을 시 문자열을 숫자로 변환해야 한다. - 자바 API에서 메서드 제공 : Integer 클래스의 `parseInt()`, Double 클래스의 `parseDouble()` + +## Java 제어문 + +- 조건 제어문 : `if`, `if-else`, `if-else if`, `switch` 문 +- 반복 제어문 : `for`, `while`, `do-while` 문 +- 이동 제어문 : `break`, `continue`, `return` From 1a842ef28afbfdc79518b144629948d097620ea0 Mon Sep 17 00:00:00 2001 From: Seogeurim Date: Wed, 13 Jan 2021 02:18:17 +0900 Subject: [PATCH 5/9] =?UTF-8?q?[Java]=20java=EC=9D=B4=EB=A1=A0=20=EB=AA=A9?= =?UTF-8?q?=EC=B0=A8=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/language/java/1.md | 263 +++++++++++++++++++++++++++++++ contents/language/java/README.md | 256 +----------------------------- 2 files changed, 266 insertions(+), 253 deletions(-) create mode 100644 contents/language/java/1.md diff --git a/contents/language/java/1.md b/contents/language/java/1.md new file mode 100644 index 0000000..f4118ad --- /dev/null +++ b/contents/language/java/1.md @@ -0,0 +1,263 @@ +# 자바 언어의 구조와 기본 문법 + +> 작성자 : [서그림](https://github.com/Seogeurim) + +
+Table of Contents + +- [Java 언어의 탄생 배경](#java-언어의-탄생-배경) +- [Java의 10가지 특징](#java의-10가지-특징) +- [Java 플랫폼](#java-플랫폼) +- [Java 프로그램 구조](#java-프로그램-구조) +- [Java 데이터 타입과 변수](#java-데이터-타입과-변수) +- [Java 연산자](#java-연산자) +- [Java의 배열](#java의-배열) +- [Java 제어문](#java-제어문) + +
+ +## Java 언어의 탄생 배경 + +### 썬마이크로시스템즈의 Green Project에서 시작 + +Green Project에서는 가정용 전자기기의 통합적 제어를 위해, 전자기기에서 사용되는 작은 컴퓨터 언어를 제안했다. 가정용 전자기기에 사용되는 power나 memory가 열악했기 때문에 여기에 사용되는 언어는 작고 견고하고, 신뢰할 수 있는 코드를 필요로 했다. 또한 다른 CPU가 선택될 수 있기 때문에 특정 디바이스에 종속되면 안 되었다. 따라서 **Virtual Machine에서 동작하는 중간 코드를 생성하여 이식성이 높은 언어를 디자인**하게 되었다. + +초기에는 절차 지향 + 객체 지향 언어인 C++ 기반으로 개발되었다. 하지만 C++ 언어가 가진 한계에 부딪혀 **완벽한 객체 지향 언어**인 Oak 언어를 개발하였고, 이미 존재하는 이름이라 추후 **Java**로 이름이 바뀌게 되었다. + +그 후 Java를 기반으로 한 HotJava라는 웹 브라우저를 제작하였는데, Java의 Applet 이라는 기능을 보여주기 위해 브라우저가 중간 코드(Bytecode)를 해석할 수 있도록 만들었다. 이 때 자바 붐이 일어나 Java 언어가 급격히 확산되었다. 이후 많은 업체들이 Java를 지원하기 시작하였고, 1996년 자바 2 플랫폼이라고 명명되었던 자바 버전 1.2가 출시되었다. 그리고 현재까지 많은 버전들이 출시되고 있다. + +## Java의 10가지 특징 + +1. **단순 (Simple)** + C(절차 지향) + C++(객체 지향) 언어를 기초로 하지만, C언어의 복잡한 기능을 제외하여 코드를 단순하게 작성할 수 있다. 특히 가비지 컬렉터(Garbage Collector)에 의한 자동 메모리 관리로 할당된 메모리 해제를 신경쓰지 않아도 된다. +2. **객체지향 (Object-Oriented)** + 자바는 객체 지향 언어로, 언어라는 객체를 사용해 프로그램을 작성하도록 한다. 이로써 **재사용성(Reusability)** 을 높일 수 있다. 코드의 재사용, 객체의 재사용 뿐만 아니라 수많은 클래스 라이브러리들을 API로 제공함으로서 재사용성을 높이고 있다. +3. **분산 처리 (Distributed)** + Java는 분산 환경에서 TCP/IP 등의 프로토콜을 통해 효율적으로 실행할 수 있도록 설계된 언어이다. Java는 다음을 지원한다. + - TCP/IP 네트워크 기능 내장 + - HTTP, FTP 등과 같은 프로토콜에 대한 라이브러리 제공 + - 서로 다른 컴퓨터 상의 객체들도 원격으로 호출하여 실행할 수 있는 원격 메서드 호출과 관련된 RMI(Remote Method Invocation) 기능의 라이브러리 제공 +4. **인터프리터 (Interpreter)** + 프로그래밍 언어는 인터프리터 언어, 컴파일 언어로 나뉜다. 자바는 **컴파일 언어인 동시에 인터프리터 언어**이며, 인터프리터에 의해 실행된다. 자바 프로그램은 다음과 같은 실행 과정을 거친다. + - 소스코드(.java) ▶︎ **컴파일(Compile): javac** ▶︎ 중간코드(.class): 바이트 코드, 클래스 파일 ▶︎ **기계어로 해석(Interprete): java** ▶︎ 실행 +5. **견고 (Robust)** + 다양한 플랫폼(컴퓨터) 상에서 실행되기 위해서는 **높은 신뢰성**이 중요하다. 자바는 다음과 같은 기능들을 지원함으로서 높은 신뢰성을 구현하였다. + - 포인터를 사용하지 않음 + - 가비지 컬렉션(Garbage Collector) 기능 + - 엄격한 데이터 타입의 검사 : 에러 조기 발견 + - Runtime 에러 처리 +6. **안전 (Secure)** + 컴파일 시 엄격한 검사를 통해 프로그램 실행 시 발생할 수 있는 장애를 미리 방지한다. 소스코드가 컴파일된 .class 형태의 바이트코드는 **클래스 로더**, **바이트 코드 검증기**를 거친다. 이 때 문제가 없으면 인터프리터로 넘겨 실행하게 된다. + - 클래스 로더 : 코드가 자신/다른 컴퓨터에서 온 것인지 판단하고 **코드를 분리**한다. + - 바이트 코드 검증기 : **코드를 검증**하여 문제가 없을 시 인터프리터로 넘긴다. +7. **플랫폼 독립적 (Architecture Neutral)** + 운영체제, CPU 등의 **하드웨어 사양에 관계 없이 실행**될 수 있다. 작성된 자바 프로프램은 자바 컴파일러를 거쳐 자바 가상 머신에서 기계어로 번역되게 된다. 번역된 기계어 코드는 하드웨어 사양에 관계 없이 동일하게 실행된다. +8. **높은 성능 (High Performance)** + **가비지 컬렉션(Garbage Collection) 기능**이 추가되어 있어 자동으로 메모리 관리가 가능하다. 이는 메모리가 할당된 객체의 상태를 추적하여 더 이상 참조되지 않으면 자동으로 할당된 메모리를 해제하여 불필요한 메모리 낭비를 방지하는 기능이다. +9. **멀티스레드 (Multithread)** + 자바는 멀티스레드를 지원한다. 이는 한 번에 여러 개의 스레드가 동시에 수행되는 과정으로, 하나의 CPU가 여러 프로그램을 동시에 수행하도록 함으로서 수행 속도를 빠르게 한다. +10. **동적 (Dynamic)** + 자바는 변화되는 환경에 잘 적응하도록 설계된 언어이다. 따라서 기존의 프로그램에 영향을 주지 않고 라이브러리에 새로운 메서드나 속성들을 추가할 수 있으며, 프로그램 간 라이브러리의 연결을 Runtime에 수행함으로써 라이브러리의 변화를 곧바로 적용할 수 있다. + +## Java 플랫폼 + +플랫폼(Platform)이란, 프로그램이 실행될 수 있는 HW 및 SW 환경을 의미한다. + +일반적인 플랫폼은 하드웨어 및 하드웨어를 제어하는 운영체제로 구성되어 있지만, 자바 플랫폼은 소프트웨어만으로 구성된다. 자바 플랫폼은 일반적으로 JDK(Java Development Kit)라는 툴로 설치된다. + +### 자바 플랫폼의 종류 + +- **Java SE (Java 2 Platform Standard Edition)** + 가장 기본이 되는 에디션, 자바 언어 대부분의 패키지가 포함된다. +- **Java EE (Java 2 Platform Enterprise Edition)** + 현업에서 사용되는 API들이 집약된 에디션이다. (JSP, Servlet, JDBC 등) +- **Java ME (Java 2 Platform Micro Edition)** + 모바일 기기 등에서 사용되는 API가 포함된 에디션이다. + +### 자바 플랫폼의 구조 + +자바 프로그램은 **자바 가상 머신** 위에서 동작한다. 자바 가상 머신에는 **자바 API** (자바 프로그램을 작성하는 데 기본적으로 활용할 수 있는 클래스 라이브러리, 즉 표준 API 라이브러리)가 제공된다. + +![image](https://user-images.githubusercontent.com/22045163/104326478-20603f80-552d-11eb-8845-4a6bf5218570.png) + +**자바 가상 머신(JVM, Java Virtual Machine)** 은 자바 프로그램과 운영체제 중간에 존재하여 서로를 분리함으로써, 애플리케이션이 운영체제에 영향 받지 않고 동작할 수 있는 환경을 제공한다. 단, JVM은 운영체제와 직접적으로 통신을 해야 하기 때문에 운영체제에 맞는 JVM을 설치해주어야 한다. + +**자바 API(Application Programming Interface)** 는 프로그래머가 필요로 하는 기본적인 클래스(Class)들을 거대한 라이브러리로 미리 만들어서 제공한다. 자바 언어 자체는 작고 단순한 구조를 갖지만, 많은 기능들을 API에서 제공하고 있다. 자바 API는 관련된 기능의 클래스들을 묶어 패키지의 형태로 제공한다. _(주요 패키지 : java.applet, java.awt, java.io, java.lang, java.net, javax.swing, java.util)_ + +## Java 프로그램 구조 + +- **자바 클래스(class)** 는 자바 프로그램의 최소 구성 단위로, 선언된 클래스 내부에 실행에 필요한 변수나 메서드 등이 정의된다. 일반적으로 자바 프로그램은 하나의 `.java` 파일에 하나의 클래스 정의를 원칙으로 한다. +- **자바 애플리케이션** 은 바이트 코드로 번역된 후에 바로 실행할 수 있는 프로그램이다. 클래스 내에 `main()` 메서드를 가지고 있어야 한다. +- 자바는 **블록(`{}`)** 으로 자바 문장들의 집합을 표현한다. 블록의 시작과 끝이 짝을 이루지 않으면 컴파일 오류가 발생하며, 클래스, 메서드, 자바 구문(`if`, `for`, `try-catch` 등)에 사용된다. +- 자바 문장은 **세미콜론(`;`)** 을 사용해 문장들을 구분한다. + +```java +public class 클래스명 { + // 변수 정의 + // 메서드 정의 + public static void main(String args[]) { + // 실행될 프로그램 코드 + } +} +``` + +## Java 데이터 타입과 변수 + +- **데이터 타입**은 데이터의 성격을 규정한다. +- 사용할 데이터를 **변수**에 저장하고 관리함으로써 데이터의 의미를 정확하게 해석하여 사용할 수 있다. + +### 데이터 타입 + +| 표현형태 | 데이터 타입 | 크기 | 표현 범위 | (자동 초기화 시) 초기값 | +| :-------: | :---------: | :-----------: | :-------------------------------: | :---------------------: | +| 논릿값 | boolean | 1bit | true/false | false | +| 단일 문자 | char | 16bit (2byte) | `'\u0000'` ~ `'\uffff'` | `'\u0000'` (Null) | +| 정수 | byte | 8bit (1byte) | -2^7 ~ 2^7-1 (-128 ~ 127) | 0 | +| 정수 | short | 16bit (2byte) | -2^15 ~ 2^15-1 (-32768 ~ 32767) | 0 | +| 정수 | int | 32bit (4byte) | -2^31 ~ 2^31-1 (약 -21억 ~ 21억) | 0 | +| 정수 | long | 64bit (8byte) | -2^63 ~ 2^63-1 | 0L | +| 실수 | float | 32bit (4byte) | 1.4E-45 ~ 3.4028235E38 | 0.0F | +| 실수 | double | 64bit (8byte) | 4.9E-324 ~ 1.7976931348623157E308 | 0.0D | + +\* 정수 : 부호가 있는 정수, 형을 명시하지 않으면 `int`가 기본형 +\* 실수 : 부호가 있는 부동소수점 실수, 형을 명시하지 않으면 `double`이 기본형 +_(부동소수점이란, 컴퓨터가 소수점이 포함된 실수를 표현하는 방식 중 하나이다. 이는 고정소수점과 달리 소수점을 자유로이 움직일 수 있어서 표현할 수 있는 수의 범위가 매우 넓다는 장점이 있다.)_ +\* 초기화 : 메서드(함수) 안에서 선언된 변수인 지역변수는 자동으로 초기화되지 않는다. +\* 참조형(Reference Type) 변수의 초기값 : `null` + +#### 데이터 타입의 범위 초과 시 발생하는 오류 + +- 컴파일 오류 : **변수 초기화 시** 범위를 초과하는 경우 발생 +- 런타임 오류 : **연산 결과**로 범위를 초과하는 경우 발생 + +#### 데이터 타입의 변환, 형변환 + +변수의 타입을 다른 타입으로 변경하고자 할 때, **형변환 연산자**를 사용해 변환할 수 있다. 작은 데이터 타입에서 큰 데이터 타입으로 변환하는 것을 **묵시적 형변환(Promotion)**, 그 반대를 **명시적 형변환(Demotion)** 이라고 한다. + +- **묵시적 형변환(Promotion)** : 데이터 손실의 우려가 없어 자동 캐스팅 가능하다. **(자동 형변환)** + + ```java + int age = 25; + double avgAge = age; // double avgAge = (double)age; + ``` + + - 위와 같이 형변환 연산자인 `(double)`을 생략할 수 있다. + - 단, 다음의 규칙에 따라 자동 형변환이 이루어진다. + - byte -> short -> int -> long -> float -> double 순 + - char -> int -> long -> float -> double 순 + +- **명시적 형변환(Demotion)** : 더 작은 범위를 나타내는 데이터 타입으로 변환하기 때문에 데이터 손실의 우려가 있어 명시적 캐스팅이 필요하다. **(축소 형변환)** + + ```java + double avgAge = 24.56; + int age = (int)avgAge; + ``` + + - 위와 같이 형변환 연산자를 명시해주어야 한다. + - 단, 데이터 타입이 축소되어 변환된 후에도 해당 값을 표현할 수 있어야 한다. 다음은 올바르지 못한 예이다. + + ```java + int sum = 128 + byte data = (byte)sum // -128 + ``` + +### 변수 + +- 변수는 컴퓨터 내부의 데이터와 1:1 대응되어 변수를 통해 메모리상의 데이터에 접근 가능하다. +- 기본형(Primitive Type)과 참조형(Reference Type) 두 가지 변수가 존재한다. +- 전역(Global) 변수와 지역(Local) 변수로 선언할 수 있다. +- 변수는 자신이 속한 블록({})을 벗어나면 사용이 불가하다. + +#### 전역(Global) 변수와 지역(Local) 변수 + +- **전역(Global) 변수** : 클래스 선언부 밑에 선언된 변수로, 여러 메서드에서 공통으로 사용할 수 있다. +- **지역(Local) 변수** : 메서드 선언부 밑 또는 메서드 매개변수로 선언된 변수로, 해당 변수가 선언된 메서드 내에서만 사용 가능하다. + +#### 변수 선언 + +- 자바 가상 머신(JVM)에게 데이터를 저장하기 위한 메모리 할당을 요청하는 것이다. +- 데이터가 필요로 하는 크기의 메모리 할당을 위해 데이터 타입을 명시해야 한다. + +## Java 연산자 + +### 산술 연산자 + +- 정수형, 실수형에 사용됨 +- 증감 연산자 : `++`, `--` (단항) +- 부호 연산자 : `+`, `-`, `*`, `/` (이항) +- 나머지 연산자 : `%` (이항) + +### 비교 연산자 + +- 대소 비교나 객체의 타입 비교 등에 사용됨 +- 비교 연산을 수행한 결과로 `boolean` 타입의 결과를 리턴함 +- `>`, `>=`, `<`, `<=`, `==`, `!=`, `instanceof` + - `값1 instanceof 값2` : `값1`이 `값2` 데이터 타입의 객체인 경우 `true` 반환 + +### 논리 연산자 + +- `boolean` 데이터 타입에 적용되며, `boolean` 타입의 결과를 리턴함 +- `&`, `&&`, `|`, `||`, `!` + - `값1 && 값2`, `값1 || 값2` 의 경우, `값1`이 `false`인 경우 `값2`를 수행하지 않고 `false`를 리턴한다. + +### 비트 연산자 + +- 값을 비트(bit)로 연산하는 연산자 +- 메모리를 최대한 효율적으로 활용해야 하는 경우 비트 단위로 데이터를 관리해야 한다. +- `&` 논리곱(and), `|` 논리합(or), `^` 배타 논리합(exclusive or, XOR), `~` 보수(not) +- `>>`, `>>>`, `<<` 시프트 + - `값1 >> 값2` : `값1`을 비트 단위로 `값2`의 비트 수만큼 오른쪽으로 시프트, 왼쪽에는 현재 부호 비트가 채워짐 + - `값1 >>> 값2` : `값1`을 비트 단위로 `값2`의 비트 수만큼 오른쪽으로 시프트, 왼쪽에는 0이 채워짐 + - `값1 << 값2` : `값1`을 비트 단위로 `값2`의 비트 수만큼 왼쪽으로 시프트, 오른쪽에는 0이 채워짐 + +### 기타 연산자 + +- 대입 연산자 (`=`) : 변수의 값을 저장, 오른쪽의 값을 왼쪽에 대입 +- 조건 삼항 연산자 (`? :`) : `if~else`문을 축약하여 사용할 수 있다. + - `변수 = 조건 ? 값1 : 값2` : 조건이 참이면 `값1`이 변수에 대입되고, 거짓이면 `값2`가 변수에 대입된다. + +## Java의 배열 + +배열은 같은 타입의 데이터들의 모임으로, 메모리가 절약되고, 쉽고 간결하게 프로그램을 작성할 수 있다. + +### 일차원 배열의 선언과 사용 + +- 배열 객체를 참조할 배열 변수 선언 ▶︎ 배열 객체 생성 + - 배열 변수 선언 : `데이터타입 배열변수명[];` 또는 `데이터타입[] 배열변수명;` + - 배열 객체 생성 : `배열변수명 = new 데이터타입[배열의 길이];` + - 두 구문을 합쳐 한 문장으로 표현 가능 + +### 이차원 배열 + +- 다차원 배열 : 일차원 배열을 여러 개 사용하여 다시 배열을 구현한 것, 즉 배열의 배열 +- 배열의 크기를 나타내는 배열 첨자(`[]`)를 차수에 따라 추가하면 된다. +- 배열 객체를 참조할 배열 변수 선언 ▶︎ 배열 객체 생성 + - 배열 변수 선언 : `데이터타입 배열변수명 [][];` 또는 `데이터타입[][] 배열변수명;` 또는 `데이터타입[] 배열변수명 [];` + - 배열 객체 생성 : `배열변수명 = new 데이터타입[배열의 배열 길이][배열 길이];` 또는 + `배열변수명 = new 데이터타입[배열의 배열 길이][]; 배열변수명[인덱스 번호] = new 데이터타입[배열 길이];` + +### 명령행 매개변수 + +`main()` 메서드란, 자바 애플리케이션에 필수적으로 포함되어야 하는 메서드로, 애플리케이션이 실행될 때 자동으로 실행된다. 일반적으로 자바 애플리케이션은 `main()` 메서드 내에서 다른 클래스 객체를 생성하고, 그 객체의 메서드 호출 또는 변수 조작 과정을 통해 원하는 결과를 얻는다. + +```java +public class CommandLineArgTest { + public static void main(String args[]) { + // code + } +} +``` + +위 코드의 `main()` 메서드를 살펴보면 `String args[]`라는 매개변수를 볼 수 있는데, 이를 **명령행 매개변수**라고 한다. 명령행 매개변수는 문자열 배열을 매개변수로 받아, 프로그램 실행 시 필요한 정보를 프로그램에 전달한다. + +- String 데이터 타입의 배열이다. +- 사용자가 입력한 문자열의 순서에 따라 차례로 배열에 저장된다. +- 공백을 구분자로 여러 개의 값을 전달할 수 있다. +- 문자열 타입이므로 숫자를 입력했을 시 문자열을 숫자로 변환해야 한다. + - 자바 API에서 메서드 제공 : Integer 클래스의 `parseInt()`, Double 클래스의 `parseDouble()` + +## Java 제어문 + +- 조건 제어문 : `if`, `if-else`, `if-else if`, `switch` 문 +- 반복 제어문 : `for`, `while`, `do-while` 문 +- 이동 제어문 : `break`, `continue`, `return` diff --git a/contents/language/java/README.md b/contents/language/java/README.md index 6b73204..75a4a61 100644 --- a/contents/language/java/README.md +++ b/contents/language/java/README.md @@ -1,255 +1,5 @@ # Java -> 작성자 : [서그림](https://github.com/Seogeurim) - -## Java Overview - -### Java 언어의 탄생 배경 - -#### 썬마이크로시스템즈의 Green Project에서 시작 - -Green Project에서는 가정용 전자기기의 통합적 제어를 위해, 전자기기에서 사용되는 작은 컴퓨터 언어를 제안했다. 가정용 전자기기에 사용되는 power나 memory가 열악했기 때문에 여기에 사용되는 언어는 작고 견고하고, 신뢰할 수 있는 코드를 필요로 했다. 또한 다른 CPU가 선택될 수 있기 때문에 특정 디바이스에 종속되면 안 되었다. 따라서 **Virtual Machine에서 동작하는 중간 코드를 생성하여 이식성이 높은 언어를 디자인**하게 되었다. - -초기에는 절차 지향 + 객체 지향 언어인 C++ 기반으로 개발되었다. 하지만 C++ 언어가 가진 한계에 부딪혀 **완벽한 객체 지향 언어**인 Oak 언어를 개발하였고, 이미 존재하는 이름이라 추후 **Java**로 이름이 바뀌게 되었다. - -그 후 Java를 기반으로 한 HotJava라는 웹 브라우저를 제작하였는데, Java의 Applet 이라는 기능을 보여주기 위해 브라우저가 중간 코드(Bytecode)를 해석할 수 있도록 만들었다. 이 때 자바 붐이 일어나 Java 언어가 급격히 확산되었다. 이후 많은 업체들이 Java를 지원하기 시작하였고, 1996년 자바 2 플랫폼이라고 명명되었던 자바 버전 1.2가 출시되었다. 그리고 현재까지 많은 버전들이 출시되고 있다. - -### Java 특징 - -1. **단순 (Simple)** - C(절차 지향) + C++(객체 지향) 언어를 기초로 하지만, C언어의 복잡한 기능을 제외하여 코드를 단순하게 작성할 수 있다. 특히 가비지 컬렉터(Garbage Collector)에 의한 자동 메모리 관리로 할당된 메모리 해제를 신경쓰지 않아도 된다. -2. **객체지향 (Object-Oriented)** - 자바는 객체 지향 언어로, 언어라는 객체를 사용해 프로그램을 작성하도록 한다. 이로써 **재사용성(Reusability)** 을 높일 수 있다. 코드의 재사용, 객체의 재사용 뿐만 아니라 수많은 클래스 라이브러리들을 API로 제공함으로서 재사용성을 높이고 있다. -3. **분산 처리 (Distributed)** - Java는 분산 환경에서 TCP/IP 등의 프로토콜을 통해 효율적으로 실행할 수 있도록 설계된 언어이다. Java는 다음을 지원한다. - - TCP/IP 네트워크 기능 내장 - - HTTP, FTP 등과 같은 프로토콜에 대한 라이브러리 제공 - - 서로 다른 컴퓨터 상의 객체들도 원격으로 호출하여 실행할 수 있는 원격 메서드 호출과 관련된 RMI(Remote Method Invocation) 기능의 라이브러리 제공 -4. **인터프리터 (Interpreter)** - 프로그래밍 언어는 인터프리터 언어, 컴파일 언어로 나뉜다. 자바는 **컴파일 언어인 동시에 인터프리터 언어**이며, 인터프리터에 의해 실행된다. 자바 프로그램은 다음과 같은 실행 과정을 거친다. - - 소스코드(.java) ▶︎ **컴파일(Compile): javac** ▶︎ 중간코드(.class): 바이트 코드, 클래스 파일 ▶︎ **기계어로 해석(Interprete): java** ▶︎ 실행 -5. **견고 (Robust)** - 다양한 플랫폼(컴퓨터) 상에서 실행되기 위해서는 **높은 신뢰성**이 중요하다. 자바는 다음과 같은 기능들을 지원함으로서 높은 신뢰성을 구현하였다. - - 포인터를 사용하지 않음 - - 가비지 컬렉션(Garbage Collector) 기능 - - 엄격한 데이터 타입의 검사 : 에러 조기 발견 - - Runtime 에러 처리 -6. **안전 (Secure)** - 컴파일 시 엄격한 검사를 통해 프로그램 실행 시 발생할 수 있는 장애를 미리 방지한다. 소스코드가 컴파일된 .class 형태의 바이트코드는 **클래스 로더**, **바이트 코드 검증기**를 거친다. 이 때 문제가 없으면 인터프리터로 넘겨 실행하게 된다. - - 클래스 로더 : 코드가 자신/다른 컴퓨터에서 온 것인지 판단하고 **코드를 분리**한다. - - 바이트 코드 검증기 : **코드를 검증**하여 문제가 없을 시 인터프리터로 넘긴다. -7. **플랫폼 독립적 (Architecture Neutral)** - 운영체제, CPU 등의 **하드웨어 사양에 관계 없이 실행**될 수 있다. 작성된 자바 프로프램은 자바 컴파일러를 거쳐 자바 가상 머신에서 기계어로 번역되게 된다. 번역된 기계어 코드는 하드웨어 사양에 관계 없이 동일하게 실행된다. -8. **높은 성능 (High Performance)** - **가비지 컬렉션(Garbage Collection) 기능**이 추가되어 있어 자동으로 메모리 관리가 가능하다. 이는 메모리가 할당된 객체의 상태를 추적하여 더 이상 참조되지 않으면 자동으로 할당된 메모리를 해제하여 불필요한 메모리 낭비를 방지하는 기능이다. -9. **멀티스레드 (Multithread)** - 자바는 멀티스레드를 지원한다. 이는 한 번에 여러 개의 스레드가 동시에 수행되는 과정으로, 하나의 CPU가 여러 프로그램을 동시에 수행하도록 함으로서 수행 속도를 빠르게 한다. -10. **동적 (Dynamic)** - 자바는 변화되는 환경에 잘 적응하도록 설계된 언어이다. 따라서 기존의 프로그램에 영향을 주지 않고 라이브러리에 새로운 메서드나 속성들을 추가할 수 있으며, 프로그램 간 라이브러리의 연결을 Runtime에 수행함으로써 라이브러리의 변화를 곧바로 적용할 수 있다. - -### Java 플랫폼 - -플랫폼(Platform)이란, 프로그램이 실행될 수 있는 HW 및 SW 환경을 의미한다. - -일반적인 플랫폼은 하드웨어 및 하드웨어를 제어하는 운영체제로 구성되어 있지만, 자바 플랫폼은 소프트웨어만으로 구성된다. 자바 플랫폼은 일반적으로 JDK(Java Development Kit)라는 툴로 설치된다. - -#### 자바 플랫폼의 종류 - -- **Java SE (Java 2 Platform Standard Edition)** - 가장 기본이 되는 에디션, 자바 언어 대부분의 패키지가 포함된다. -- **Java EE (Java 2 Platform Enterprise Edition)** - 현업에서 사용되는 API들이 집약된 에디션이다. (JSP, Servlet, JDBC 등) -- **Java ME (Java 2 Platform Micro Edition)** - 모바일 기기 등에서 사용되는 API가 포함된 에디션이다. - -#### 자바 플랫폼의 구조 - -자바 프로그램은 **자바 가상 머신** 위에서 동작한다. 자바 가상 머신에는 **자바 API** (자바 프로그램을 작성하는 데 기본적으로 활용할 수 있는 클래스 라이브러리, 즉 표준 API 라이브러리)가 제공된다. - -![image](https://user-images.githubusercontent.com/22045163/104326478-20603f80-552d-11eb-8845-4a6bf5218570.png) - -**자바 가상 머신(JVM, Java Virtual Machine)** 은 자바 프로그램과 운영체제 중간에 존재하여 서로를 분리함으로써, 애플리케이션이 운영체제에 영향 받지 않고 동작할 수 있는 환경을 제공한다. 단, JVM은 운영체제와 직접적으로 통신을 해야 하기 때문에 운영체제에 맞는 JVM을 설치해주어야 한다. - -**자바 API(Application Programming Interface)** 는 프로그래머가 필요로 하는 기본적인 클래스(Class)들을 거대한 라이브러리로 미리 만들어서 제공한다. 자바 언어 자체는 작고 단순한 구조를 갖지만, 많은 기능들을 API에서 제공하고 있다. 자바 API는 관련된 기능의 클래스들을 묶어 패키지의 형태로 제공한다. _(주요 패키지 : java.applet, java.awt, java.io, java.lang, java.net, javax.swing, java.util)_ - -## Java 언어의 구조와 기본 문법 - -### Java 프로그램 구조 - -- **자바 클래스(class)** 는 자바 프로그램의 최소 구성 단위로, 선언된 클래스 내부에 실행에 필요한 변수나 메서드 등이 정의된다. 일반적으로 자바 프로그램은 하나의 `.java` 파일에 하나의 클래스 정의를 원칙으로 한다. -- **자바 애플리케이션** 은 바이트 코드로 번역된 후에 바로 실행할 수 있는 프로그램이다. 클래스 내에 `main()` 메서드를 가지고 있어야 한다. -- 자바는 **블록(`{}`)** 으로 자바 문장들의 집합을 표현한다. 블록의 시작과 끝이 짝을 이루지 않으면 컴파일 오류가 발생하며, 클래스, 메서드, 자바 구문(`if`, `for`, `try-catch` 등)에 사용된다. -- 자바 문장은 **세미콜론(`;`)** 을 사용해 문장들을 구분한다. - -```java -public class 클래스명 { - // 변수 정의 - // 메서드 정의 - public static void main(String args[]) { - // 실행될 프로그램 코드 - } -} -``` - -### Java 데이터 타입과 변수 - -- **데이터 타입**은 데이터의 성격을 규정한다. -- 사용할 데이터를 **변수**에 저장하고 관리함으로써 데이터의 의미를 정확하게 해석하여 사용할 수 있다. - -### 데이터 타입 - -| 표현형태 | 데이터 타입 | 크기 | 표현 범위 | (자동 초기화 시) 초기값 | -| :-------: | :---------: | :-----------: | :-------------------------------: | :---------------------: | -| 논릿값 | boolean | 1bit | true/false | false | -| 단일 문자 | char | 16bit (2byte) | `'\u0000'` ~ `'\uffff'` | `'\u0000'` (Null) | -| 정수 | byte | 8bit (1byte) | -2^7 ~ 2^7-1 (-128 ~ 127) | 0 | -| 정수 | short | 16bit (2byte) | -2^15 ~ 2^15-1 (-32768 ~ 32767) | 0 | -| 정수 | int | 32bit (4byte) | -2^31 ~ 2^31-1 (약 -21억 ~ 21억) | 0 | -| 정수 | long | 64bit (8byte) | -2^63 ~ 2^63-1 | 0L | -| 실수 | float | 32bit (4byte) | 1.4E-45 ~ 3.4028235E38 | 0.0F | -| 실수 | double | 64bit (8byte) | 4.9E-324 ~ 1.7976931348623157E308 | 0.0D | - -\* 정수 : 부호가 있는 정수, 형을 명시하지 않으면 `int`가 기본형 -\* 실수 : 부호가 있는 부동소수점 실수, 형을 명시하지 않으면 `double`이 기본형 -_(부동소수점이란, 컴퓨터가 소수점이 포함된 실수를 표현하는 방식 중 하나이다. 이는 고정소수점과 달리 소수점을 자유로이 움직일 수 있어서 표현할 수 있는 수의 범위가 매우 넓다는 장점이 있다.)_ -\* 초기화 : 메서드(함수) 안에서 선언된 변수인 지역변수는 자동으로 초기화되지 않는다. -\* 참조형(Reference Type) 변수의 초기값 : `null` - -#### 데이터 타입의 범위 초과 시 발생하는 오류 - -- 컴파일 오류 : **변수 초기화 시** 범위를 초과하는 경우 발생 -- 런타임 오류 : **연산 결과**로 범위를 초과하는 경우 발생 - -#### 데이터 타입의 변환, 형변환 - -변수의 타입을 다른 타입으로 변경하고자 할 때, **형변환 연산자**를 사용해 변환할 수 있다. 작은 데이터 타입에서 큰 데이터 타입으로 변환하는 것을 **묵시적 형변환(Promotion)**, 그 반대를 **명시적 형변환(Demotion)** 이라고 한다. - -- **묵시적 형변환(Promotion)** : 데이터 손실의 우려가 없어 자동 캐스팅 가능하다. **(자동 형변환)** - - ```java - int age = 25; - double avgAge = age; // double avgAge = (double)age; - ``` - - - 위와 같이 형변환 연산자인 `(double)`을 생략할 수 있다. - - 단, 다음의 규칙에 따라 자동 형변환이 이루어진다. - - byte -> short -> int -> long -> float -> double 순 - - char -> int -> long -> float -> double 순 - -- **명시적 형변환(Demotion)** : 더 작은 범위를 나타내는 데이터 타입으로 변환하기 때문에 데이터 손실의 우려가 있어 명시적 캐스팅이 필요하다. **(축소 형변환)** - - ```java - double avgAge = 24.56; - int age = (int)avgAge; - ``` - - - 위와 같이 형변환 연산자를 명시해주어야 한다. - - 단, 데이터 타입이 축소되어 변환된 후에도 해당 값을 표현할 수 있어야 한다. 다음은 올바르지 못한 예이다. - - ```java - int sum = 128 - byte data = (byte)sum // -128 - ``` - -### 변수 - -- 변수는 컴퓨터 내부의 데이터와 1:1 대응되어 변수를 통해 메모리상의 데이터에 접근 가능하다. -- 기본형(Primitive Type)과 참조형(Reference Type) 두 가지 변수가 존재한다. -- 전역(Global) 변수와 지역(Local) 변수로 선언할 수 있다. -- 변수는 자신이 속한 블록({})을 벗어나면 사용이 불가하다. - -#### 전역(Global) 변수와 지역(Local) 변수 - -- **전역(Global) 변수** : 클래스 선언부 밑에 선언된 변수로, 여러 메서드에서 공통으로 사용할 수 있다. -- **지역(Local) 변수** : 메서드 선언부 밑 또는 메서드 매개변수로 선언된 변수로, 해당 변수가 선언된 메서드 내에서만 사용 가능하다. - -#### 변수 선언 - -- 자바 가상 머신(JVM)에게 데이터를 저장하기 위한 메모리 할당을 요청하는 것이다. -- 데이터가 필요로 하는 크기의 메모리 할당을 위해 데이터 타입을 명시해야 한다. - -## Java 연산자 및 배열 - -### Java 연산자 - -#### 산술 연산자 - -- 정수형, 실수형에 사용됨 -- 증감 연산자 : `++`, `--` (단항) -- 부호 연산자 : `+`, `-`, `*`, `/` (이항) -- 나머지 연산자 : `%` (이항) - -#### 비교 연산자 - -- 대소 비교나 객체의 타입 비교 등에 사용됨 -- 비교 연산을 수행한 결과로 `boolean` 타입의 결과를 리턴함 -- `>`, `>=`, `<`, `<=`, `==`, `!=`, `instanceof` - - `값1 instanceof 값2` : `값1`이 `값2` 데이터 타입의 객체인 경우 `true` 반환 - -#### 논리 연산자 - -- `boolean` 데이터 타입에 적용되며, `boolean` 타입의 결과를 리턴함 -- `&`, `&&`, `|`, `||`, `!` - - `값1 && 값2`, `값1 || 값2` 의 경우, `값1`이 `false`인 경우 `값2`를 수행하지 않고 `false`를 리턴한다. - -#### 비트 연산자 - -- 값을 비트(bit)로 연산하는 연산자 -- 메모리를 최대한 효율적으로 활용해야 하는 경우 비트 단위로 데이터를 관리해야 한다. -- `&` 논리곱(and), `|` 논리합(or), `^` 배타 논리합(exclusive or, XOR), `~` 보수(not) -- `>>`, `>>>`, `<<` 시프트 - - `값1 >> 값2` : `값1`을 비트 단위로 `값2`의 비트 수만큼 오른쪽으로 시프트, 왼쪽에는 현재 부호 비트가 채워짐 - - `값1 >>> 값2` : `값1`을 비트 단위로 `값2`의 비트 수만큼 오른쪽으로 시프트, 왼쪽에는 0이 채워짐 - - `값1 << 값2` : `값1`을 비트 단위로 `값2`의 비트 수만큼 왼쪽으로 시프트, 오른쪽에는 0이 채워짐 - -#### 기타 연산자 - -- 대입 연산자 (`=`) : 변수의 값을 저장, 오른쪽의 값을 왼쪽에 대입 -- 조건 삼항 연산자 (`? :`) : `if~else`문을 축약하여 사용할 수 있다. - - `변수 = 조건 ? 값1 : 값2` : 조건이 참이면 `값1`이 변수에 대입되고, 거짓이면 `값2`가 변수에 대입된다. - -### Java의 배열 - -배열은 같은 타입의 데이터들의 모임으로, 메모리가 절약되고, 쉽고 간결하게 프로그램을 작성할 수 있다. - -#### 일차원 배열의 선언과 사용 - -- 배열 객체를 참조할 배열 변수 선언 ▶︎ 배열 객체 생성 - - 배열 변수 선언 : `데이터타입 배열변수명[];` 또는 `데이터타입[] 배열변수명;` - - 배열 객체 생성 : `배열변수명 = new 데이터타입[배열의 길이];` - - 두 구문을 합쳐 한 문장으로 표현 가능 - -#### 이차원 배열 - -- 다차원 배열 : 일차원 배열을 여러 개 사용하여 다시 배열을 구현한 것, 즉 배열의 배열 -- 배열의 크기를 나타내는 배열 첨자(`[]`)를 차수에 따라 추가하면 된다. -- 배열 객체를 참조할 배열 변수 선언 ▶︎ 배열 객체 생성 - - 배열 변수 선언 : `데이터타입 배열변수명 [][];` 또는 `데이터타입[][] 배열변수명;` 또는 `데이터타입[] 배열변수명 [];` - - 배열 객체 생성 : `배열변수명 = new 데이터타입[배열의 배열 길이][배열 길이];` 또는 - `배열변수명 = new 데이터타입[배열의 배열 길이][]; 배열변수명[인덱스 번호] = new 데이터타입[배열 길이];` - -#### 명령행 매개변수 - -`main()` 메서드란, 자바 애플리케이션에 필수적으로 포함되어야 하는 메서드로, 애플리케이션이 실행될 때 자동으로 실행된다. 일반적으로 자바 애플리케이션은 `main()` 메서드 내에서 다른 클래스 객체를 생성하고, 그 객체의 메서드 호출 또는 변수 조작 과정을 통해 원하는 결과를 얻는다. - -```java -public class CommandLineArgTest { - public static void main(String args[]) { - // code - } -} -``` - -위 코드의 `main()` 메서드를 살펴보면 `String args[]`라는 매개변수를 볼 수 있는데, 이를 **명령행 매개변수**라고 한다. 명령행 매개변수는 문자열 배열을 매개변수로 받아, 프로그램 실행 시 필요한 정보를 프로그램에 전달한다. - -- String 데이터 타입의 배열이다. -- 사용자가 입력한 문자열의 순서에 따라 차례로 배열에 저장된다. -- 공백을 구분자로 여러 개의 값을 전달할 수 있다. -- 문자열 타입이므로 숫자를 입력했을 시 문자열을 숫자로 변환해야 한다. - - 자바 API에서 메서드 제공 : Integer 클래스의 `parseInt()`, Double 클래스의 `parseDouble()` - -## Java 제어문 - -- 조건 제어문 : `if`, `if-else`, `if-else if`, `switch` 문 -- 반복 제어문 : `for`, `while`, `do-while` 문 -- 이동 제어문 : `break`, `continue`, `return` +- [자바 언어의 구조와 기본 문법](./1.md) +- 객체지향 핵심 원리 +- 자바 API 활용 From 638f546d3440bac4baa6a1fa9c72581e717e873a Mon Sep 17 00:00:00 2001 From: Seogeurim Date: Wed, 13 Jan 2021 02:22:12 +0900 Subject: [PATCH 6/9] =?UTF-8?q?[Java]=20java=EC=9D=B4=EB=A1=A0=20=EB=AA=A9?= =?UTF-8?q?=EC=B0=A8=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/language/README.md | 4 +++- contents/language/java/README.md | 5 ----- 2 files changed, 3 insertions(+), 6 deletions(-) delete mode 100644 contents/language/java/README.md diff --git a/contents/language/README.md b/contents/language/README.md index 49f2c6f..236255f 100644 --- a/contents/language/README.md +++ b/contents/language/README.md @@ -2,6 +2,8 @@ ## [Java](./java) -- Java Overview & Basic +- [자바 언어의 구조와 기본 문법](./java/1.md) +- 객체지향 핵심 원리 +- 자바 API 활용 ## C++ diff --git a/contents/language/java/README.md b/contents/language/java/README.md deleted file mode 100644 index 75a4a61..0000000 --- a/contents/language/java/README.md +++ /dev/null @@ -1,5 +0,0 @@ -# Java - -- [자바 언어의 구조와 기본 문법](./1.md) -- 객체지향 핵심 원리 -- 자바 API 활용 From 8f55308fdd6b2008025ac348cb8c741bdfb124ca Mon Sep 17 00:00:00 2001 From: Seogeurim Date: Thu, 14 Jan 2021 01:56:44 +0900 Subject: [PATCH 7/9] =?UTF-8?q?[java]=20=EA=B0=9D=EC=B2=B4=EC=A7=80?= =?UTF-8?q?=ED=96=A5=20=EC=9D=B4=EB=A1=A0=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/language/README.md | 4 +- contents/language/java/2.md | 110 ++++++++++++++++++++++++++++++++++++ 2 files changed, 112 insertions(+), 2 deletions(-) create mode 100644 contents/language/java/2.md diff --git a/contents/language/README.md b/contents/language/README.md index 236255f..46628b7 100644 --- a/contents/language/README.md +++ b/contents/language/README.md @@ -1,9 +1,9 @@ # Language -## [Java](./java) +## Java - [자바 언어의 구조와 기본 문법](./java/1.md) -- 객체지향 핵심 원리 +- [객체지향 핵심 원리](./java/2.md) - 자바 API 활용 ## C++ diff --git a/contents/language/java/2.md b/contents/language/java/2.md new file mode 100644 index 0000000..0c39888 --- /dev/null +++ b/contents/language/java/2.md @@ -0,0 +1,110 @@ +# 객체지향 핵심 원리 + +> 작성자 : [서그림](https://github.com/Seogeurim) + +
+Table of Contents + +- [객체 지향 핵심 개념](#객체-지향-핵심-개념) +- [객체 지향 언어의 주요 개념](#객체-지향-언어의-주요-개념) + +
+ +## 객체 지향 핵심 개념 + +### 객체 지향 패러다임의 등장 + +1960년대 말, 하드웨어 발전 속도에 비해 소프트웨어 발전 속도가 느리다는 현상에 따라 '소프트웨어 위기론'이 등장하였다. 이 때 하드웨어와 소프트웨어의 특징을 비교해보면 다음과 같다. + +- 하드웨어는 각 기능들이 독립적인 모듈로 개발된다. + 여러 모듈을 조립할 수 있고, 특정 모듈이 고장나거나 성능이 떨어지면 교체 및 수정이 용이하다. +- 소프트웨어는 모듈화가 되지 않았다. + 따라서 한 번 작성된 코드는 재사용이 어렵다는 문제점이 있었다. + +이러한 분석에 따라 **모듈화된 소프트웨어 개발에 대한 요구**가 발생하였고, 이는 **객체 지향 패러다임**으로 이어졌다. + +### 객체 지향 프로그래밍 (OOP, Object Oriented Programming) + +객체 지향 프로그래밍이 등장하기 이전에는 **절차 지향 프로그래밍**이었다. 절차 지향 프로그래밍 언어는 **실행 순서가 위 -> 아래로 순차적으로 진행**되었고, 코드 재사용을 위해서는 기존에 만들어진 코드를 **복사 + 붙여넣기** 해야 했다. + +이러한 문제점을 극복하기 위해 **함수**가 등장하였다. 함수는 **자주 사용되는 특정한 코드를 하나의 모듈(묶음)으로 묶어 놓은 것**이다. 따라서 필요할 때마다 함수를 호출해서 사용하는 방식으로 코드 재사용이 가능했지만, 데이터와 함수 간 유기적인 관계성을 갖지 못한다는 아쉬움이 있었다. + +이후 **객체 지향 프로그래밍**이 등장하면서 함수보다 더 높은 모듈화를 지원하게 된다. **객체 자신이 가진 고유의 데이터를 처리하는 메서드가 등장**하게 된 것이다. 이를 통해 보다 높은 유지보수성을 가지게 되었고, 객체 간 자유로운 데이터 이동이 가능해지게 되었다. + +### 객체, 클래스, 인스턴스 + +> 관계 : 객체 ▶︎ 클래스 ▶︎ 인스턴스 + +- **객체 (Object)** : 현실 세계에 존재하는 유무형의 모든 것 + - 정적인 요소 : 변수 (Variable) + - 동적인 요소 : 메서드 (Method) +- **클래스 (Class)** : 현실 세계의 객체를 프로그램에서 이용할 수 있는 객체로 표현하는 것 + - 현실 세계의 객체를 컴퓨터 메모리에 생성할 수 있는 템플릿이라고 볼 수 있다. + - 자바 프로그램을 구성하는 가장 기본적인 요소이다. +- **인스턴스 (Instance)** : 컴퓨터 메모리에 존재하는 객체 + - 클래스로부터 생성된 컴퓨터 메모리 상의 객체이다. + - Object = Instance + +## 객체 지향 언어의 주요 개념 + +### 상속 (Inheritance) + +만일 기존의 클래스에 대하여 속성과 메서드가 약간 다른 객체를 필요로 한다고 생각해보자. 이 경우 **상속**을 이용하면 이미 존재하는 클래스를 바탕으로 필요한 변수, 메서드를 추가 정의하여 새로운 클래스를 작성할 수 있다. + +#### 상속의 특징 + +- 코드의 재사용성을 높임 + 공통적 속성/기능에 대하여 수정이 필요한 경우 해당 클래스에 대해서만 수정하면 된다. +- 객체들 사이의 계층 구조를 이룰 수 있음 + - 상위 계층으로 갈수록 : 일반화, 보편화 + - 하위 계층으로 갈수록 : 특수화, 개별화 +- 자식 클래스는 자신의 변수&메서드 뿐만 아니라 부모 클래스의 변수와 메서드를 모두 사용할 수 있다. +- 상속 관계는 **논리적으로** 반드시 **is a~ 관계**가 성립되어야 한다. + 부모-자식 클래스의 관계가 일반화, 특별화 관계(is a~)에 있어야 한다. 이는 문법적으로 강제되는 것이 아니라 논리적으로 판단되어야 한다. 그렇지 않으면 유지보수가 어려워진다. + +#### 상속의 종류 + +- 다중 상속 : 하나의 하위 클래스가 두 개 이상의 상위 클래스를 갖는 것 +- 단일 상속 : 하나의 하위 클래스가 단 하나의 상위 클래스를 갖는 것 + +자바는 단일 상속만을 지원하는 언어이다. + +### 다형성 (Polymorphism) + +> one interface, multiple implementation + +인터페이스는 하나지만 인터페이스의 구현체는 여러가지를 만들어 사용할 수 있다는 개념이다. + +다형성은 메서드 오버로딩과 오버라이딩을 통해 지원된다. + +- **오버로딩(Overloading)** : 한 클래스 안에 같은 이름의 메서드를 여러개 정의하면서, 그 인자의 개수나 유형을 다르게 해 놓은 형태 +- **오버라이딩(Overriding)** : 상속 관계에 있는 하위 클래스가 상위 클래스가 가지고 있는 메서드를 재정의하는 것 (재정의된 메서드가 선언된 형태는 상위 클래스에서 선언된 것과 같음) + +### 추상화 (Abstraction) + +현실 세계에 존재하는 다양한 객체들의 공통된 특성을 모아 일반화 해놓는 것으로, 클래스를 정의하는 데 중요한 역할을 한다. + +> ex. [비행기, 자동차, 열차, 배]는 화물이나 승객을 운반한다는 공통적 특징이 있다. +> 따라서 운송 수단으로 추상화가 가능하며, 더 나아가 클래스로서 정의가 가능하다. + +### 캡슐화 (Encapsulation) + +변수와 메서드를 하나의 추상화된 클래스로 묶어 독립적으로 동작하지 않도록 한다. 이들은 따로 분리할 수 없다. 객체를 이용할 때는 객체가 제공하는 메서드를 통해 이용하고 데이터가 실제로 어떻게 처리되는지는 알 필요 없다. + +### 정보 은닉 (Information Hiding) + +캡슐화된 변수나 메서드를 선택적으로 공개하거나 숨길 수 있다는 개념이다. 숨겨야 하는 정보는 `private`, 공개하는 정보는 `public`으로 관리하며 외부에서는 `public`만 접근이 가능하다. + +### 메시지 (Message) + +객체들은 서로 메시지를 주고 받는 방식으로 **통신**한다. + +객체 간에 메시지를 주고 받기 때문에 여러 객체는 동일한 프로세스를 가질 필요가 없으며, 서로 메시지를 주고 받는데 객체가 존재하는 위치는 제약이 되지 않는다. + +메시지 형식 + +- 메시지를 전달할 대상 객체 ex. car +- 전달하고 싶은 메시지 ex. changeGear +- 메시지를 통해 전달하고 싶은 부가정보가 있다면 해당 정보 ex. lowerGear + +ex. Person 객체가 Car 객체에게 낮은 기어로 변속을 요청하고 싶으면 `car.changeGear(lowerGear)`와 같은 형식으로 메시지를 전달하면 된다. From f1a094544cb566af0e67a0905f1481821968cfcb Mon Sep 17 00:00:00 2001 From: Seogeurim Date: Wed, 27 Jan 2021 09:26:26 +0900 Subject: [PATCH 8/9] =?UTF-8?q?[java]=20=EA=B0=9D=EC=B2=B4=EC=A7=80?= =?UTF-8?q?=ED=96=A5=20=EC=9D=B4=EB=A1=A0=EC=A0=95=EB=A6=AC?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/language/java/2.md | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/contents/language/java/2.md b/contents/language/java/2.md index 0c39888..2b57524 100644 --- a/contents/language/java/2.md +++ b/contents/language/java/2.md @@ -85,7 +85,7 @@ 현실 세계에 존재하는 다양한 객체들의 공통된 특성을 모아 일반화 해놓는 것으로, 클래스를 정의하는 데 중요한 역할을 한다. > ex. [비행기, 자동차, 열차, 배]는 화물이나 승객을 운반한다는 공통적 특징이 있다. -> 따라서 운송 수단으로 추상화가 가능하며, 더 나아가 클래스로서 정의가 가능하다. +> 따라서 **운송 수단**으로 추상화가 가능하며, 더 나아가 클래스로서 정의가 가능하다. ### 캡슐화 (Encapsulation) @@ -101,10 +101,26 @@ 객체 간에 메시지를 주고 받기 때문에 여러 객체는 동일한 프로세스를 가질 필요가 없으며, 서로 메시지를 주고 받는데 객체가 존재하는 위치는 제약이 되지 않는다. -메시지 형식 +#### 메시지 형식 -- 메시지를 전달할 대상 객체 ex. car -- 전달하고 싶은 메시지 ex. changeGear -- 메시지를 통해 전달하고 싶은 부가정보가 있다면 해당 정보 ex. lowerGear +- 메시지를 전달할 대상 객체 ex. `car` +- 전달하고 싶은 메시지 ex. `changeGear` +- 메시지를 통해 전달하고 싶은 부가정보가 있다면 해당 정보 ex. `lowerGear` -ex. Person 객체가 Car 객체에게 낮은 기어로 변속을 요청하고 싶으면 `car.changeGear(lowerGear)`와 같은 형식으로 메시지를 전달하면 된다. +> ex. Person 객체가 Car 객체에게 낮은 기어로 변속을 요청하고 싶으면 `car.changeGear(lowerGear)`와 같은 형식으로 메시지를 전달하면 된다. + +## 클래스의 구조 + +## 자바 Modifier와 생성자 + +## 메서드 Overloading과 매개변수 + +## 자바의 상속 + +## 추상 클래스와 객체의 형변환 + +## 인터페이스와 패키지 + +## 예외 처리 + +## java.lang 패키지 From 2a689c9b74e2af30f0f6ad97d84d5aa76c2e6c7d Mon Sep 17 00:00:00 2001 From: Seogeurim Date: Wed, 27 Jan 2021 20:06:18 +0900 Subject: [PATCH 9/9] =?UTF-8?q?[java]=20=EC=9E=90=EB=B0=94=EB=85=BC?= =?UTF-8?q?=EB=A6=AC=EC=97=B0=EC=82=B0=EC=9E=90=20=EC=9D=B4=EB=A1=A0?= =?UTF-8?q?=EC=A0=95=EB=A6=AC=20=EC=88=98=EC=A0=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contents/language/java/1.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/contents/language/java/1.md b/contents/language/java/1.md index f4118ad..b2b4e13 100644 --- a/contents/language/java/1.md +++ b/contents/language/java/1.md @@ -198,7 +198,9 @@ _(부동소수점이란, 컴퓨터가 소수점이 포함된 실수를 표현하 - `boolean` 데이터 타입에 적용되며, `boolean` 타입의 결과를 리턴함 - `&`, `&&`, `|`, `||`, `!` - - `값1 && 값2`, `값1 || 값2` 의 경우, `값1`이 `false`인 경우 `값2`를 수행하지 않고 `false`를 리턴한다. + - `값1 && 값2`의 경우, `값1`이 `false`인 경우 `값2`를 수행하지 않고 `false`를 리턴한다. + - `값1 || 값2`의 경우, `값1`이 `true`인 경우 `값2`를 수행하지 않고 `true`를 리턴한다. + - `&`, `|` 연산자는 모든 조건을 다 확인한 후 그 결과를 리턴한다. ### 비트 연산자