자바는 기존의 프로그래밍 언어인 C/C++(이하 C라 명명한다.) 계열과 비슷한 문법을 보이면서도 내부적으로 실행될 때는 확연한 차이점을 가지고 있다. C는 기계어로 번역되고 메모리에 적재되어 CPU에서 직접 처리된다. 반면 자바는 바이트코드(Byte code)라는 특수한 코드로 번역되어 가상의 CPU인 JVM(Java Virtual Machine)이 그 실행을 맡고 CPU에 처리를 맡긴다. 따라서 자바는 JVM이라는 가상의 CPU를 가지고 있기 때문에 플랫폼이 독립적이다.

1. 컴퓨터와 관련하여 플랫폼이라는 용어는 응용프로그램이 실행될 수 있는 기초를 이루는 컴퓨터 시스템을 의미한다. PC에서는 두 개의 서로 다른 플랫폼의 예로서 윈도우95와 매킨토시를 들 수 있으며, 대형 서버나 메인프레임에서는 IBM의 System/390을 하나의 플랫폼으로 볼 수 있다.

하나의 플랫폼은 운영체계, 컴퓨터 시스템의 보조 프로그램, 그리고 마이크로프로세서, 논리연산을 수행하고, 컴퓨터 내의 데이터 이동을 관장하는 마이크로칩 등으로 구성된다. 운영체계는 특정 마이크로프로세서의 명령어셋과 함께 동작할 수 있도록 설계되어야 한다. 예를 들면, 마이크로소프트의 윈도우95는 같거나 비슷한 종류의 명령어셋을 공유할 수 있는 인텔의 마이크로프로세서군과 함께 동작할 수 있도록 만들어졌다. 마더보드나 데이터 버스 등과 같이 어떠한 컴퓨터 플랫폼이라도 보통 다르게 적용된 부품들이 있지만, 이러한 부품들은 점차적으로 모듈화되고 표준화되어가고 있다.

역사적으로 대부분의 응용프로그램들은 특정 플랫폼 상에서만 운영되도록 개발되어 왔다. 각 플랫폼은 다른 시스템 서비스들을 위해 다른 응용프로그램 인터페이스를 제공한다. 그러므로 윈도우 플랫폼에서 운영되기 위해 개발된 PC 프로그램을, 매킨토시 플랫폼에서 운영하기 위해서는 프로그램을 처음부터 다시 개발해야만 했다. 비록 이러한 플랫폼의 차이들은 계속 존재하고, 그들 사이에는 항상 독점기술에 관한 차이가 존재하겠지만, 표준을 따르는 새로운 개방형 인터페이스를 통해 이제는 일부 프로그램들이 다른 플랫폼에서 운영될 수 있고, 브로커 프로그램 등의 중재를 통해 서로 다른 플랫폼 간의 상호 운영이 가능해지고 있다.

2. 플랫폼은 다른 기술들 또는 공정들이 그 위에서 구현될 수 있는 일종의 기술 기반을 의미하기도 한다

내용을 간단히 요약해보면..

cpu가 멀티코어 시대가 되었으며 때문에 2개의 cpu에서 동시에 실행하는 멀티스레드 환경이 되었다. 기존의 Lock 동기화 메커니즘을 사용하면 멀티코어 성능을 제대로 활용할 수 없다. 멀티 스레드에 완벽하게 안전한 언어가 요구된다. 함수 언어는 동기화 없이 멀티스레드에 항상 안전하다. 이렇게 서론을 띄우고 SCALA라는 언어를 소개한다.

SCALA

Scala는 다음 같은 몇 가지 강력한 장점을 가진 함수-객체 혼성 언어다. 다음은 SCALA의 특징이다.

1. 자바 바이트코드로 컴파일되고 JVM 위에서 실행된다. 자바의 풍부한 오픈소스 환경을 활용할 수 있을 뿐 아니라 별도의 이행 비용 없이 현재의 IT 환경에 통합할 수 있다.

2. 스칼라는 하스켈(Haskell)과 ML의 함수 원리에 기반을 두고 있으면서도 여전히 자바 프로그래머가 좋아하는 친숙한 객체 지향 개념을 많이 빌어왔다. 결과적으로 양쪽의 최선을 하나로 녹여냈다.

3. 마지막으로 스칼라는 자바 커뮤니티에서 Pizza와 GJ 언어로 잘 알려진 Martine Odersky에 의해 개발되었다. 참고로 GJ는 현재 Java 5 제네릭스(Generics)의 프로토타입이다. 이 같이 스칼라는 "뭔가 진지한 성과"라는 느낌을 준다. 별 생각 없이 만들어 별 생각 없이 버려지는 언어가 되지는 않을 것이다.

정리해 보자면.. 멀티스레드에 안전하다는 함수적 개념을 도입한 Java의 확정버젼?? 이렇게 해석된다. 믿을만한 사람이 개발했기 때문에 앞으로도 더 발전할 것이라는..

너무 객체지향개념에 얽매여서 고민하기 보다는 일단 프로그램을 기능적으로 완성한 다음 어떻게 하면 보다 객체지향적으로 코드를 개선할 수 있을지를 고민하여 점차 개선해 나가는 것이 좋다.

이러한 경험들이 축적되어야 프로그램을 객체지향적으로 설계할 수 있는 능력이 길러지는 것이지 처음부터 이론을 많이 안다고 해서 좋은 설계를 할 수 있는 것은 아니다.

int iv; // 인스턴스 변수

static int cv; // 클래스 변수

1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통적으로 사용해야하는 것에 static을 붙인다.

2. 클래스변수(static변수)는 인스턴스를 생성하지 않아도 사용할 수 있다.

3. 클래스메서드(static메서드)는 인스턴스변수를 사용할 수 없다.

4. 메서드 내에서 인스턴스변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

- 클래스의 멤버변수 중 모든 인스턴스에 공통된 값을 유지해야하는 것이 있는지 살펴보고 있으면, static을 붙인다.

- 작성한 메서드 중에서 인스턴스 변수를 사용하지 않는 메서드에 대해서 static을 붙일 것을 고려한다.

class MyMath2{

long a, b;

// 인스턴스변수 a, b만을 이용해서 작업하므로 매개변수가 필요없다.

long add() { return a + b; } // a, b는 인스턴스 변수

// 인스턴스변수와 관계없이 매개변수로만으로 작업이 가능하다.

static long add(long a, long b) { return a + b; } // a, b는 지역변수

}

class MyMathTest2{

public static void main(String args[]){

//클래스메서드 호출

System.out.println(MyMath2.add(200L, 200L));

MyMath2 mm = new MyMath2();

mm.a = 200L;

mm.b = 100L;

System.out.println(mm.add());

}

}

------------------------------------------------------

MemberCall c = new MemberCall();

int result = c.instanceMethod1();

int result = new MemberCall().instanceMethod1();

------------------------------------------------------

기본형 매개변수

------------------------------------------------------

static void change (int x){ // 기본형 매개변수

x =10000;

System.out.println("change() : x = " + x);

}

------------------------------------------------------

참조형 매개변수

------------------------------------------------------

class Data { int x; };

class ParameterTest2 {

public static void main (String[] args) {

Data d = new Data();

d.x = 10;

System.out.println("main() : x = " + d.x);

Change(d);

System.out.println("After Change(d)");

System.out.println("main() : x = " + d.x);

}

static void change (Data d){ // 참조형 매개변수

d.x = 1000;

System.out.println("change() : x = " + d.x);

}

}

------------------------------------------------------

참조형 매개변수

------------------------------------------------------

class ParameterTest3 {

public static void main (String[] args) {

int[] x = {10}; // 크리가 1인 배열. x[0] = 10;

System.out.println("main() : x = " + x[0]);

Change(x);

System.out.println("After Change(x)");

System.out.println("main() : x = " + x[0]);

}

static void change (int[] x){ // 참조형 매개변수

x[0] = 1000;

System.out.println("change() : x = " + x[0]);

}

}

메서드 오버로딩 이란?

한 클래스 내에 같은 이름의 메서드를 여러 개 정의하는 것을 메서드 오버로딩(method overloading)또는 간단히 오버로딩(overloading)이라 한다.

오버로딩의 조건

1. 메서드 이름이 같아야 한다.

2. 매개변수의 개수 또는 타입이 달라야 한다.

3. 매개변수는 같고 리턴타입이 다른 경우는 오버로딩이 성립되지 않는다.

(리턴타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.)

오버로딩의 장점

1. 메서드도 변수처럼 단지 이름만으로 구별된다면, 한 클래스내의 모든 메서드들은 이름이 달라야 한다. 근본적으로는 같은 기능을 하는 메서드들이지만, 서로 다른 이름을 가져야 하기 때문에 메서드를 작성하는 쪽에서는 이름을 짓기도 어렵고, 메서드를 사용하는 쪽에서는 이름을 일일이 구분해서 기억해야 하기 때문에 서로 부담이 된다.

2. 메서드의 이름을 절약할 수 있다는 것이다. 하나의 이름으로 여러 개의 메서드를 정의할 수 있으니, 메서드의 이름을 짓는데 고민을 덜 수 있는 동시에 사용되었어야 할 메서드 이름을 다른 메서드의 이름으로 사용할 수 있기 때문이다.

예)

void println()

void printlnBoolean(boolean x)

void printlnChar(char x)

void printlnDouble(double x)

void printlnString(String x)

생성자란?

생성자는 인스턴스가 생성될 때 호출되는 ‘인스턴스 초기화 메서드’이다. 따라서 인스턴스 변수의 초기화 작업에 주로 사용되며, 인스턴스 생성 시에 실행되어야 할 작업을 위해서도 사용된다.

인스턴스 초기화 : 인스턴스변수들을 초기화하는 것을 뜻한다.

생성자 조건

1. 생성자의 이름은 클래스의 이름과 같아야 한다.

2. 생성자는 리턴 값이 없다.

Card c = new Card();

1. 연산자 new에 의해서 메모리(heap)에 Card클래스의 인스턴스가 생성된다.

2. 생성자 Card()가 호출되어 수행된다.

3. 연산자 new의 결과로, 생성된 Card인스턴스의 주소가 반환되어 참조변수 c에 저장된다.

생성자에서 다른 생성자 호출하기 - this(), this

- 생성자의 이름으로 클래스이름 대신 this를 사용한다

- 한 생성자에서 다른 생성자를 호출할 때는 반드시 첫 줄에서만 호출이 가능하다.

this - 인스턴스 자신을 가리키는 참조변수, 인스턴스의 주소가 저장되어 있다.

this(), this(매개변수) - 생성자, 같은 클래스의 다른 생성자를 호출할 때 사용한다.

인스턴스를 생성할 때는 다음의 2가지 사항을 결정해야 한다.

1. 클래스 - 어떤 클래스의 인스턴스를 생성할 것인가?

2. 생성자 - 선택한 클래스의 어떤 생성자로 인스턴스를 생성할 것인가?

int door = 4; // 기본형(primitive type) 변수의 초기화

Engine e = new Engine(); // 참조형(reference type) 변수의 초기화

오버로딩 vs 오버라이딩

오버로딩 : 기존에 없는 새로운 메서드를 정의하는 것(new)

오버라이딩 : 상속받은 메서드의 내용을 변경하는 것(change, modify)

class Parent {

void parentMethod() {}

}

class Child extends Parent {

void parentMethod() {} // 오버라이딩

void parentMethod(int i) {} // 오버로딩

void childMethod() {}

void childMethod(int i) {} // 오버로딩

void childMethod() {} // 에러, 중복정의 되었음

}

패키지 : 클래스의 묶음

간단한 프로그램이나 애플릿은 패키지를 지정하지 않아도 별 문제 없지만, 큰 프로젝트나 Java API와 같은 클래스 라이브러리를 작성하는 경우에는 미리 패키지를 구성하여 적용하도록 한다.

하나의 소스파일에 단 한번만 선언될 수 있다.

import문

컴파일러에게 소스파일에 사용된 클래스의 패키지에 대한 정보를 제공하는 것이다. 컴파일 시에 컴파일러는 import문을 통해 소프파일에 사용된 클래스들의 패키지를 알아 낸 다음, 모든 클래스이름 앞에 패키지명을 붙여 준다.

import문의 선언

모든 소스파일(.java)에서 import문은 package문 다음에, 그리고 클래스 선언 문 이전에 위치해야한다. 그리고 import문은 package문과는 달리 한 소스파일에 여러 번 선언할 수 있다.

1. package문

2. import문

3. 클래스 선언

import 패키지명.클래스명;

import 패키지명.*;

프로그램 오류

프로그램이 실행 중 어떤 원인에 의해서 오작동을 하거나 비정상적으로 종료되는 경우가 있다. 이러한 결과를 초래하는 원인을 프로그램 에러 또는 오류라고 한다.

이를 발생시점에 따라 ‘컴파일 에러(compile-time error)’와 '런타임 에러(runtime error)'로 나눌 수 있는데, 글자 그대로 ‘컴파일 에러’는 컴파일 할 때 발생하는 에러이고 프로그램 실행도중에 발생하는 에러를 ‘런타임 에러’라고 한다.

자바에서는 실행 시(runtime) 발생할 수 있는 프로그램 오류를 ‘에러(error)’와 ‘예외(exception)' 두 가지로 구분하였다. 에러는 메모리 부족(outofmemoryerror)이나 스택오버플로우(stackoverflowerror)와 같이 일단 발생하면 복구할 수 없는 심각한 오류이고, 예외는 발생하더라도 수습될 수 있는 비교적 덜 심각한 것이다.

예외처리

정의 - 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것

목적 - 프로그램의 비정상 종료를 막고, 정상적인 실행상태를 유지하는 것

class ExceptionEx3 {

public static void main(String arg[]){

int number = 100;

int result = 0;

for (int i=0; i<10; i++){

try{

result = number / (int)(Math.random() * 10);

System.out.println(result);

} catch (ArithmeticException e) {

System.out.println("0");

} // try-catch의 끝

} // for문 끝

}

}

class NewExceptionTest {

public static void main(String arg[]){

try{

startInstall(); // 프로그램 설치에 필요한 준비를 한다.

copyFiles(); // 파일을 복사한다.

} catch (SpaceException e) {

System.out.println("에러 메시지 : " + e.getMessage());

e.printStackTrace();

System.out.println("공간을 확보한 후에 다시 설치하시기 바랍니다.");

} catch (MemoryException me) {

System.out.println("에러 메시지 : " + e.getMessage());

me.printStackTrace();

System.gc(); // Garbage Collection을 수행하여 메모리를 늘려준다.

System.out.println("다시 설치를 시도하세요");

} finally {

deleteTempFiles(); // 프로그램 설치에 사용된 임시파일을 삭제한다.

} // try의 끝

} // main의 끝

static void startInstall() throws SpaceException, MemoryException {

if(!enoughSpace()) // 충분한 설치 공간이 없으면...

throw new SpaceException("설치할 공간이 부족합니다.");

if (enoughMemory()) // 충분한 메모리가 없으면...

throw new MemoryException("메모리가 부족합니다.");

} // StartInstall 메서드의 끝

static void copyFile() {}

static void deleteTempFile() {}

static boolean enoughSapce() {

// 설치하는데 필요한 공간이 있는 확인하는 코드를 적는다.

return false;

}

static boolean enoughMemory() {

// 설치하는데 필요한 메모리공간이 있는 확인하는 코드를 적는다.

return true;

}

} // NewExceptionTest 클래스의 끝

class SpaceException extends Exception {

MemoryException(String msg){

super(msg);

}

}

1. 컬렉션 프레임윅(collection Framework)

- 다수의 데이터를 쉽게 처리할 수 있는 표준화된 방법을 제공하는 클래스들

2. 유용한 클래스 - 알아두면 좋은 아주 쓰이는 클래스들

3. 형식화 클래스 - 데이터를 표준화된 형식으로 출력하는데 도움을 주는 클래스들


+ Recent posts