1. Java
목차
Java의 역사 및 특징
Java
객체지향, 클래스 기반, 플랫폼 독립적 프로그래밍
Write Once Run Anywhere(WORA)
C → C++ → Java
C
1970년대 Dennis Ritchie에 의해 개발
프로그래머 친화적인 structed programming(if/then/else, while, for)→기존 BASIC, COBOL, FORTRAN등의 복잡성 해결
BUT 여전히 프로그램 크기가 커질 때 복잡해지는 문제발생
C++
1979년 Bjarne Stroustrup에 의해 개발
C with Classes → C++
기존언어 + 객체지향프로그래밍 특성
1980s~1990초 객체지향프로그래밍 언어로 널리 사용
💡 C, C++는 코드를 특정 CPU타겟에 맞춰 컴파일필요 → 모든 CPU에 대해 컴파일러를 만들면 개발자에게 많은 비용과 시간을 요구
Java의 등장
- 1991년 James Gosling을 필두로 한 Sun Microsystems*의 연구원들이 개발
- *2009년 Oracle이 인수
- Oak → java(1995년)
- 플랫폼 독립적(paltform independent)언어로 개발(본래 가전제품 컨트롤러에서 실행되는)
- 당시에는 가전제품 하드웨어 칩의 성능 이슈로 시기상조
- World Wide Web의 등장으로 중요성 부각: Web에는 다양한 운영체제와 하드웨어가 공존
- 어느 시스템에서도 실행가능한 프로그램의 필요성 대두
- Web의 발전과 함께 급속도로 퍼짐
Java의 특징
- 이식성(portability) & 보안성(security)
- 인터넷의 발전
→ 다양한 네트워크 시스템
“네트워크 시스템은 어느 플랫폼에서도 동작하며(이식성), 악성코드의 실행으로부터 안전해야함(보안성)” - java의 동작원리는 이식성, 보안성을 만족시킴
Java의 동작원리
💡 C, C++코드가 기계어로 컴파일 되는 것과 대비
- java코드는 컴파일 시 중간언어인 바이트코드(bytecode)로 변환
- 자바 가상 머신(Java Virtual Machine, JVM)에서 실행
- JVM은 자바 런타임 환경(Java Runtime Environment, JRE)의 일부
- JRE만 있으면 어느 프로그램이든 실행가능(이식성)
-
JVM내에서 실행돼 안전(보안성)→샌드박싱(sandboxing)
- JBM은 바이트코드 해석 후 실행이 요구됨 → 낮은 성능 이슈
→ JIT(Just-in-time)컴파일러가 JVM에 포함됨
→ 런타임에 바이트코드를 기계어로 해석하여 실행(유튜브에서 미리 영상로딩하는 것처럼) - JDK(Java Delvelopment Kit)를 이용해 개발
-
OpenJDK
Sun Microsystems 에서 2007년 공개한 오픈소스 JDK
GPL(General Public License)적용
-
Oracle JDK
Oracle에서 제공하는 JDK
NFTC(No-Fee Terms and Conditions)라이센스 적용
-
Java applet
- java의 대표적 웹 애플리케이션(JRX를 지원하는 브라우저면 프로그램 실행 가능)
- 브라우저들에게 플러그인 지원을 강제(공인인증서 설치) →2017년 Java9부터 퇴출됨
Java servlet
applet | servlet |
---|---|
클라이언트 프로그램 | 서버 프로그램 |
- 데이터베이스 등과 연동하여 클라이언트 요청처리
- JRE를 지원하는 모든 서버에서 실행가능
Java 릴리즈 히스토리
- Java 1.4 까지는 J2SE(Java 2 Platform Standard Edition)로 명칭
- Java 1.5부터 대규모 업데이트(제네릭, 어노테이션, 오토박싱, 열거형, for-each 등)
→ Java 5로 개명 -
Java10부터 6개월 단위로 업데이트
Java Buzzwords
간단함(simple) 프로그래머 친화적
견고함(robust) 메모리 오류로부터 안전
멀티쓰레드 지원(multithreaded) 병렬처리 구현이 쉬움
고성능(high-performance) JIT컴파일러로 성능 최적화
분산(distributed) 분산 네트워크 환경에 친화적
객체지향적(object-oriented) C++보다 더 객체지향적
객체지향프로그래밍
프로그래밍 패러다임
- program=code+data
- process-oriented(절차지향)
- 코드를 중심으로 하는 프로그래밍 기법
- 프로그램의 크기가 커질수록 복잡해지고 확장이 어려움
- object-oriented(객체지향)
- 데이터를 중심으로 하는 프로그래밍 기법
- 절차지향에 비해 더 직관적
Abstraction(추상화)
- 모든것을 object화하여 복잡성 해결
- Java는 3가지 원리에 기반해 달성
3가지 원리
encapsulation(캡슐화)
- 관련 데이터와 코드를 하나로 묶어 외부로부터 은닉
- 외부에서 임의로 접근하지 못하도록 보호
- interface를 통해서만 제어가능
- ex) 리모콘 조작을 위해 사용자는 버튼 이용
- 구현이 달라도 사용자에게 동일 인터페이스 제공
- Java는 class단위로 캡슐화
- 오브젝트의 데이터와 코드를 정의한 설계도
- 코드를 method단위로 묶고 접근자를 설정하여 은닉
inheritance(상속)
- 한 오브젝트가 다른 오브젝트의 특징을 물려받는 것
- 상속으로 계층적구조정의
- 부모-자식 클래스 관계 or 상위-하위 클래스
- 자식 클래스는 부모 클래스의 특징 물려받음
polymorphism(다형성)
- 동일한 인터페이스가 서로 다른 클래스에서 동작하도록 적용
- 행위는 동일 but 입력 데이터에 따라 action달라짐
- 정수형, 실수형, 문자형 stack 구현할 때
- C의 경우
- 각 타입 별로 구현 후 개별 인터페이스 정의 필요
- Java의 경우
- 구현 후 공통적인 인터페이스를 통해 사용
- 데이터에 따라 적용할 구현체를 JIT컴파일러가 알아서 선택
Java 기본문법
EX1
1
2
3
4
5
6
7
8
9
/*
This is a simple Java progrma.
Call this file "Example.java".
*/
//Your program begins with a call to main().
public static void main(String [] args) {
System.out.println("This is a simple Java program.");
}
주석
주석(comment)
- 프로그램에 대한 설명 기록
- 컴파일 대상에서 제외됨
주석 | 코드 |
---|---|
다수라인주석 | /* … */ |
단일라인주석 | // |
public static void main(String [] args) {
class
class *className* { … }
- 자바 소스파일은 하나 이상의 클래스를 포한
- 모든 코드는 클래스 내부에서 정의
main()
- Java 프로그램이 시작되는 곳
public
- 접근제어자(access modifier)를 의미, 클래스 멤버의 접근성 결정
💡 className도 인자
접근 제어자 | 설명 |
---|---|
public | 외부의 접근 허용 |
private | 외부의 접근 제한 |
String[] args
- main()메서의 인자(argument)
- String class의 배열 array이며 커맨드라인의 인자를 받음
System.out.println(…);
println()
- Java 문자열의 출력 표준 메서드
- 문자열 출력 후 행 변경(newline)
System.out
- System은 JVM이 실행되는 시스템을 의미하는 built-in 클래스
- out은 출력 스트림
;
- 실행문(statement)은 세미콜론으로 끝남
EX2
1
2
3
4
5
6
7
8
9
10
11
12
13
14
/*
Here is another short example.
Call this file "Example2.java".
*/
class Example2 {
public static void main(String[] args) {
int num; // this declares a variable called num
num = 100; // this assigns num the value 100
System.out.println("This is num: " + num);
num = num * 2;
System.out.print("The value of num * 2 is ");
System.out.println(num);
}
}
변수(variable)
type *variableName*
- 프로그램 실행 중 임시로 값을 저장하는 역할
System.out.println("This is num: " + num);
- 문자열에 num변수 값을 추가( + 기호)
print()
- println과 다르게 행변경을 하지 않음
EX3
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class IfSample {
public static void main(String[] args) {
int x, y;
x = 10;
y = 20;
if(x < y) System.out.println("x is less than y");
x = x * 2;
if(x == y) System.out.println("x now equal to y");
x = x * 2;
if(x > y) System.out.println("x now greater than y");
// this won't display anything
if(x == y) System.out.println("you won't see this");
}
}
If문
if(조건문)실행문;
- 조건문 만족→실행문 트리거
EX4
1
2
3
4
5
6
7
class ForTest {
public static void main(String[] args) {
int x;
for(x = 0; x < 10; x = x + 1)
System.out.println("This is x: " + x);
}
}
for문
for(초기식;조건식;증감식)
-
초기식(initialization)
제어문 변수의 값을 초기화
초기 C에서는 정의와 동시에 초기화 안됐지만 java는 첨부터 됨
-
조건식(condition)
매 루프마다 조건식 평가
True일 경우 실행문 실행
-
증감식(iteration)
제어문 변수를 어떻게 변경할 것인지 명시
대개 증감연산자(increment/decrement operator)를 이용
EX5
1
2
3
4
5
6
7
8
9
10
11
12
class BlockTest {
public static void main(String[] args) {
int x, y;
y = 20;
// the target of this loop is a block
for(x = 0; x<10; x++) {
System.out.println("This is x: " + x);
System.out.println("This is y: " + y);
y = y - 2;
}
}
}
코드블록(code blocks)
- C/C++처럼 코드블록 허용
- for/if/while문 등에서 사용
공백문자(whitespace)
- Java는 자유형식언어(free-form language)
- Python 등과 같이 들여쓰기(indent)불필요 (한 줄로 써도 됨 → ; 로 구분)
-
키워드와 식별자 간에 임의의 공백문자*만 필요
*스페이스, 탭, 개행문자 등 (
Class Example { … }
)
식별자(identifier)
- 클래스, 변수, 메서드의 이름
- 식별자 규칙
- 문자, 언더바(_), $로 시작
💡 언더바보다는 문자를 선호
- 대소문자 구분
- +, - 등 연산자 포함 금지
- Java키워드 사용금지
- 길이 무제한
- AvgTemp, count, a4, this_ok
2count, high-temp, Not/ok
키워드(keyword)
-
java는 67개의 키워드를 정의
Java클래스 라이브러리
- 대부분의 Java프로그램은 여러 표준 클래스 사용
- EX의
println()
,print()
은 빌트인 메서드System.out
을 통해 사용가능- System은 Java프로그램에 자동으로 포함되는 표준 클래스