본문 바로가기

JAVA/THEORY

[JAVA-THEORY] 자바 이론 1

[출처] 자바의정석


JAVA

JAVA는, 썬 마이크로 시스템즈에서 개발하여 발표한 객체지향 프로그래밍 언어.

자바의 특징

  1. 운영체제에 독립적이다. 운영체제에 설치한, 자바가상머신 ( JVM ) 을 통해, 자바 응용프로그램이 실행되기 때문에, 자바 프로그램은 OS 로 부터 독립적으로 실행 가능하다. ( Write Once, Run Anywhere )
  • JVM : 자바를 실행하기 위한 가상 머신,
  1. 객체지향언어이다. 객체지향 프로그래밍 언어 중 하나이며, 객체 지향개념의 특징인 [ 상속, 캡슐화, 다형성 ] 이 잘 적용된 순수한 객체지향 언어로 평가 받는다.
  2. 배우기 쉽다. 자바의 연산자와 기본 구문은 C++ 로부터, 객체지향 관련 구문은 스몰톡 이라는 객체 지향언어에서 가져왔다. 객체지향 언어의 특징인 재사용성과 유지보수의 용이성 등의 많은 장점에도, 배우기가 어려웠으나, 자바의 간결, 명료한 객체지향적 설계로 쉽게 이해하고 배울 수 있게 되었다.
  3. 자동 메모리 관리 ( Garabe Collection ) 자바로 작성된 프로그램 실행시, GC 가 자동적으로 메모리를 관리해주기 때문에, 프로그래머가 따로 메모리를 관리하지 않아도 된다. 없을 경우, 프로그래머가 직접 메모리를 관리해주어야 하지만, 자동 메모리 관리라는 약간의 비효율성과 프로그래밍의 편리성을 제공받게 된 것이다.
  4. 네트워크와 분산처리를 지원한다. 인터넷과 대규모 분산환경에 대한 다양한 네트워크 프로그래밍 라이브러리 ( JAVA API ) 를 통해 비교적 짧은 시간에 네트워크 관련 프로그램을 쉽게 개발할 수 있도록 지원한다.
  5. 멀티쓰레드 지원 운영체제마다 멀티쓰레드 사용과 처리방식이 다르지만, 자바에서 개발되는 멀티쓰레드는 시스템과 관계없이 구현하며, 자바 라이브러리를 제공하므로 구현이 쉽다. 또한, 여러 쓰레드에 대한 스케줄링을 자바 인터프리터가 담당하게 된다.
  6. 동적 로딩 ( 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 !");
  }
}

변수 선언시, 변수의 타입과 이름을 함께 작성하여 선언하고, 변수에 담을 값의 종류와 범위를 충분히 고려한 후 결정하여 사용한다.

  • 지역변수는 사용되기 전에 반드시 초기화 필요, 클래스 & 인스턴스 변수는 초기화 생략 가능

명명 규칙

  1. 대소문자가 구분되며, 길이에 제한 없다. ( Str , str 은 다른 변수 )
  2. 예약어를 사용해서는 안된다. ( true 는 예약어라 사용할 수 없다. )
  3. 숫자로 시작해서는 안된다. ( 1234Test 는 사용 불가 , Test1234 사용가능 )
  4. 특수문자는 _ , $ 만 허용 ( $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]

 

'JAVA > THEORY' 카테고리의 다른 글

[JAVA-THEORY] 자바 이론 2  (0) 2021.10.20