[출처] 자바의정석
JAVA
JAVA는, 썬 마이크로 시스템즈에서 개발하여 발표한 객체지향 프로그래밍 언어.
자바의 특징
- 운영체제에 독립적이다. 운영체제에 설치한, 자바가상머신 ( JVM ) 을 통해, 자바 응용프로그램이 실행되기 때문에, 자바 프로그램은 OS 로 부터 독립적으로 실행 가능하다. ( Write Once, Run Anywhere )
- JVM : 자바를 실행하기 위한 가상 머신,
- 객체지향언어이다. 객체지향 프로그래밍 언어 중 하나이며, 객체 지향개념의 특징인 [ 상속, 캡슐화, 다형성 ] 이 잘 적용된 순수한 객체지향 언어로 평가 받는다.
- 배우기 쉽다. 자바의 연산자와 기본 구문은 C++ 로부터, 객체지향 관련 구문은 스몰톡 이라는 객체 지향언어에서 가져왔다. 객체지향 언어의 특징인 재사용성과 유지보수의 용이성 등의 많은 장점에도, 배우기가 어려웠으나, 자바의 간결, 명료한 객체지향적 설계로 쉽게 이해하고 배울 수 있게 되었다.
- 자동 메모리 관리 ( Garabe Collection ) 자바로 작성된 프로그램 실행시, GC 가 자동적으로 메모리를 관리해주기 때문에, 프로그래머가 따로 메모리를 관리하지 않아도 된다. 없을 경우, 프로그래머가 직접 메모리를 관리해주어야 하지만, 자동 메모리 관리라는 약간의 비효율성과 프로그래밍의 편리성을 제공받게 된 것이다.
- 네트워크와 분산처리를 지원한다. 인터넷과 대규모 분산환경에 대한 다양한 네트워크 프로그래밍 라이브러리 ( JAVA API ) 를 통해 비교적 짧은 시간에 네트워크 관련 프로그램을 쉽게 개발할 수 있도록 지원한다.
- 멀티쓰레드 지원 운영체제마다 멀티쓰레드 사용과 처리방식이 다르지만, 자바에서 개발되는 멀티쓰레드는 시스템과 관계없이 구현하며, 자바 라이브러리를 제공하므로 구현이 쉽다. 또한, 여러 쓰레드에 대한 스케줄링을 자바 인터프리터가 담당하게 된다.
- 동적 로딩 ( Dynamic Loading ) 을 지원 자바로 작성된 어플리케이션은 여러 개의 클래스로 구성되어 있는데, 실행 시 모든 클래스를 로딩하지 않고, 필요한 시점에 클래스를 로딩할 수 있다는 장점이 있다. 일부 클래스 변경시에도 전체 어플리케이션을 재컴파일하지 않아도 되고, 어플리케이션 변경사항이 발생시에도 비교적 적은 작업으로 처리할 수 있는 유연한 어플리케이션을 작성할 수 있다.
※ 자바의 단점으로는 속도 문제가 대표적인데, 바이트코드를 하드웨어 기계어로 바로 변환해주는 JIT 컴파일러와 Hotspot 과 같은 신기술의 도입을 통해 JVM 의 기능이 향상함에 따라 속도 문제가 ( 지속적으로 ) 개선되었다.
class Practice01 {
public static void main(String[] args) {
System.out.println("HELLO, WORLD !");
}
}
- 자바 실행 흐름 : Hello.java ⇒ ( javac.exe ) ⇒ Hello.class ⇒ ( java.exe ) ⇒ Class 파일 검사 ⇒ main(String[] args) 호출 ⇒ 실행
- 자바의 모든 코드는 반드시 클래스 안에 존재.
- [ ] 은 배열을 의미하는 기호, 배열의 타입 또는 배열의 이름 옆에 붙일 수 있다. String [ ] args 는 String 타입의 args 라는 이름을 가진 배열을 선언한 것. ( = String args[ ] )
- { } 시작과 끝을 의미 하고, 괄호 사이에 작업할 내용을 작성하여 프로그램을 작성한다.
- 자바프로그램에서 main 메서드를 가진 클래스가 하나 이상 있어야 한다. Java App 을 실행할 때 Java.exe 를 통해 main 메서드를 포함한 클래스를 통해 App 을 실행할 수 있다.
- 하나의 클래스는 하나의 Public Class 만 존재가 가능하고, Public Class 는 해당 Java 파일과 동일한 이름을 가져야 한다.
변수 ( Variable )
값을 저장할 수 있는 메모리상의 공간을 의미. ( 단 하나의 값을 저장할 수 있는 공간 )
class Practice01 {
public static void main(String[] args) {
System.out.println("HELLO, WORLD !");
}
}
변수 선언시, 변수의 타입과 이름을 함께 작성하여 선언하고, 변수에 담을 값의 종류와 범위를 충분히 고려한 후 결정하여 사용한다.
- 지역변수는 사용되기 전에 반드시 초기화 필요, 클래스 & 인스턴스 변수는 초기화 생략 가능
명명 규칙
- 대소문자가 구분되며, 길이에 제한 없다. ( Str , str 은 다른 변수 )
- 예약어를 사용해서는 안된다. ( true 는 예약어라 사용할 수 없다. )
- 숫자로 시작해서는 안된다. ( 1234Test 는 사용 불가 , Test1234 사용가능 )
- 특수문자는 _ , $ 만 허용 ( $harp 는 허용, S#arp 는 비허용 )
- 예약어는 Keword 또는 Reserved Word 라고 하는데, 프로그래밍언어의 구문에 사용되는 단어를 뜻한다. ( 즉, 이미 다른 용도로 사용되고 있는 단어라는 의미 )
타입
기본형 ( Primitive Type ) : 실제 값을 저장
> boolean(1), char(2), byte(1), short(2), int(4), long(8), float(4), double(8) (계산을 위한 실제 값 저장, null 사용 불가)
참조형 ( Refrerence Type ) : 값이 저장되어 있는 주소를 값을 저장
> 8개의 기본형을 제외한 나머지 타입. 객체의 주소를 저장
조건문
if 문 : 조건식에 따라 true 인 경우, 해당 조건문의 내용을 수행
if(조건식){
}
if(조건식)
// 수행 내용이 하나일 경우, 블록이 없어도 된다.
// -------------------------------
if(조건식){
dosome();
if(조건식){
if(조건식){
// .. 무한 중첩가능
}
}
}
else if(조건식){
dosome();
}else{}
switch 문 : 조건의 경우의 수가 많은 경우 사용할 수 있고, 간결해 보일 수 있다.
switch(조건식){
case val1:
break;
..
default:
// 조건식과 일치하는 조건이 없을 경우 수행
}
반복문
for 문 : 조건에 따라 반복 수행하는 문법
// for(초기화; 조건식; 증감식){
for(int i=0; i<10; i++){
// 0123456789
}
while 문 : 조건에 따라 반복문을 break 할 수 있다.
// while(조건식){
int i = 0;
while(i<10){
i++;
}
- 주의할점 : 무한 반복문에 빠지지 않도록 작성해야 한다.
do-while문 : while 문과 동일하나, do의 블락을 먼저 수행한 후에, 조건식을 판단한다
int i = 9;
do{
dosometing();
}
while(i!= 10){
i++;
}
break 문, continue 문
int i= 0;
while(i<10){
i++;
System.out.println("1 Check");
if(i==5){
break; // 반복문을 종료한다
}
System.out.println("2 Check");
if(i/2){
continue; // Continue 아래의 작성된 내용은 수행하지 않는다
}
System.out.println("3 Check");
}
배열 ( Array )
같은 타입의 여러 변수를 하나의 묶음으로 다루는 것을 배열이라 한다
int num1=1, num2=2, num3=3, num4=4, ...... num1000=1000;
// 를 아래와 같이 변수의 묶음을 만들 수 있다.
// 일반(1차) 배열
int[] numbers= new int[1000]; \
for(int i=1; i<1001; i++){
numbers[i] = i;
}
// 다차원 배열
int[][] multiNumbers = new int[3][5]; // 와 같이 다차원 배열생성도 가능
multiNumbers[0][0] = 1;
multiNumbers[1][0] = 2;
// 가변 배열
int[][] variableNumbers = new int[5][];
variableNumbers[0] = new int[2];
variableNumbers[1] = new int[5];
variableNumbers[2] = new int[3]; // 과 같이 다차원 배열일 경우, 가변적인 배열길이 조절가능
배열 복사 : 복사대상 배열보다 더 큰배열이여야만 하며, 작을 경우 ArrayIndexOutOfBoundsException 에러가 발생한다.
int[] a = {1, 2, 3, 4};
int[] b = {5, 6, 7, 8, 9, 10};
System.out.println(Arrays.toString(a)); // [1, 2, 3, 4]
System.out.println(Arrays.toString(b)); // [5, 6, 7, 8, 9, 10]
// for 문을 이용한 배열 복사
for (int i = 0; i < a.length; i++) {
b[i] = a[i];
}
System.out.println(Arrays.toString(b)); // [1, 2, 3, 4, 9, 10]
// System.arraycopy 를 이용한 배열 복사
System.arraycopy(a, 0, b, 0, a.length);
System.out.println(Arrays.toString(b)); // [1, 2, 3, 4, 9, 10]