'[아시나요?]'에 해당되는 글 17건
- 2008.08.14 [아시나요?]static만이 가능한 몇가지 특징
- 2008.08.14 [아시나요?]JAR 파일 만들기 , 이용
- 2008.08.14 [아시나요?]equals 와 ==
- 2008.08.14 [아시나요?]main()메소드에 관하여
- 2008.08.14 [아시나요?]API 문서의 구조
- 2008.08.14 [아시나요?]변수의 초기화
- 2008.08.14 [아시나요?]자바가 메소드를 찾는 방법
- 2008.08.14 [아시나요?]객체
- 2008.08.14 [아시나요?]객체 지향 언어_2
- 2008.08.14 [아시나요?]객체 지향 언어1
☞클래스 이름만으로 접근 가능
static 변수나 메소드는 객체를 생성하지않아도 사용할 수 있다는 사실을 알고 있을 것이다. 보통 레퍼런스 변수를 사용하여 메소드나 변수를 호출하지만 사실상 static변수를 호출하는 다른 방법은 레퍼런스 변수를 사용할 필요 없이 클래스 이름을 통해 바로 메소드나 변수를 호출할 수 있다.
클래스_이름.static_변수
클래스_이름.static_메소드
class Static{
public static int value = 9;
public static int getValue(){
return value;
}
}
즉 클래스 앞에서 선언한 클래스의 변수와 메소드를 사용하기 위해서는 다음과 같이 클래스 이름만 사용하면 된다는 뜻이다.
int i = Static.value;
int d = Static.getValue();
예를 보면 알겠지만, static은 레퍼런스 변수를 선언하지 않고도 사용이 가능하기 때문에 문법이 매우 단순하고 사용하기 편하다. 그래서 자바의 기본 라이브러리에서도 static 을 많이 사용하고 있는데. 그 대표적인 클래스가 바로 Math 클래스이다. Math.sin() , Math()abs() 등이 모두 static 메소드로 만들어져 있음을 알 수 있을 것이다.
☞상수
final 을 사용하면 변수를 상수와 같이 이용할 수 있다. 이전까지의 방법으로 상수를 만들려면 꼭 객체를 생성해야만 하는 불편함을 가지고 있었다. 그런데 static을 사용하면 이런 번거로운 작업을 거치지 않고 모든 클래스에서 사용이 가능한 진정한 의미의 상수를 만들 수 있다. 다음 예제의 USERINFO 클래스가 바로 이런 static의 특징을 이용한 상수의 사용 예를 잘 보여주고 있다.
class UserInfo{
public static final String NAME = "홍길동";
public static final String ID = "mr.hong";
public static final int AGE = 20;
}
public class StaticCon{
public static void main(String [] args){
System.out.println("이름 : "+UserInfo.NAME);
System.out.println("ID : "+UserInfo.ID);
System.out.println("나이 : "+UserInfo.AGE);
}
}
객체 생성하는 과정이 필요없기 때문에 어떤클래스에서든 간편하게 사용할 수 있다. 이런식으로 사용하는 상수는 자바의 기본 클래스에서도 자주 볼 수 있는데, 이 상수 역시 변수와 마찬가지로 필드라는 이름을 사용한다.
☞클래스에 하나의 요소만 존재
클래스를 가지고 객체를 생성하는 방법을 알고 있다. 클래스는 붕어빵의 틀과 같아서 언제나 같은 모형의 객체를 원하는 수만큼 생성할 수 있다. 물론 클래스에 포함되어 있는 각종 메소드와 변수도 생성된 샛체의 수만큼 생성될 것이다. 그런데 재미있는 사실은 static 변수나 메소드는 객체의 생성과 함께 생성되지 않는다는 것이다. 그런데 static 은 객체가 생성되기 전에 이미 만들어져 메모리에 상주하게 되는데, 그 복사본은 만들지 않는다. 즉 처음 생성된 static 하나만이 메모리에 상주한다는 말이다.
이말의 의미를 좀더 쉽게 풀어본다면 하나의 클래스에 대한 객체가 여러 개 존재하더라도 그 안에 포함되어 있는 static 변수나 메소드는 오직하나만 존재하며 여러 객체에서 이들을 공통으로 사용하게 된다는 말이다. 공통으로 사용한다는 말의 의미가 잘 와닿지 않을 것 같아서 간단한 예제를 준비했다. TestClass에는 두 개의 변수가 선언되어 있는데, 하나는 일반 변수이고 또 하나는 static 변수이다. 이들은 TestClass가 생성될 때마다 즉 TestClass의 생성자가 호출될 때마다 자신의 값을 1씩 증가시키는 동작을 한다.
class TestClass{
private int gNumber =0; //일반변수
private static int sNumber =0;//static변수public TestClass(){
gNumber++;
sNumber++;
}
public void printVar(){
System.out.println("일반변수 : "+gNumber);
System.out.println("static변수 : "+sNumber);
System.out.println("");
}
}
class UniqueStatic{
public static void main(String [] args){
TestClass tc1 = new TestClass(); //첫번째 객체 생성
tc1.printVar();
TestClass tc2 = new TestClass(); //두번째 객체 생성
tc2.printVar();
TestClass tc3 = new TestClass(); //세번째 객체 생성
tc3.printVar();
}
}
예제는 매우 간단한 동작을 수행한다. TestClass는 생성자가 호출될 때마다 가지고 있는 변수 gNumber 와 sNumber 의 값을 1만큼씩 증가시킨다. gNumber는 일반 변수이기 때문에 객체가 생성될 때 마다 새롭게 만들어진다. 그래서 결과는 늘 1을 출력하게 된다. 그러나 sNumber는 static 변수이기 때문에 처음에 한번 생성된 것을 여러객체에서 공유하여 사용한다. 초기화도 처음 만들어질 당시에만 수행하기 때문에 생성자를 호출할 때마다 sNumber는 자신의 값을 1씩증가시킬 수 있는 것이다. 출력결과를 통해서 이 사실을 확인할 수 있다.
☞static 블록
이것은 static이 객채를 생성하기 전에 만들어진다는 사실을 이용한 것이다. 생성자가 호출되기 이전에 어떤 일을 해주어야 한다면 이 static 블록을 유용하게 사용할 수 있을 것이다. static 블록은 언제나 생성자 이전에 호출된다는 것을 보장 받을 수 있다.
static {
//해야할 일
}
다음예제를 통해서 static 블록이 생성자보다 먼저 호출됨을 확인할 수 있다.
class Block{
static{ //static 블록
System.out.println("static 블록 호출");
}
public Block(){
System.out.println("생성자 호출");
}
}
public class StaticBlock{
public static void main(String [] args){
Block b = new Block();
}}
'My work space > Java' 카테고리의 다른 글
Basic Java - Swing (0) | 2008.08.14 |
---|---|
객체직렬화 Serializable (0) | 2008.08.14 |
[아시나요?]JAR 파일 만들기 , 이용 (0) | 2008.08.14 |
쓰레드 구구단 예제 입니다 (0) | 2008.08.14 |
scjp(내용정리)_수정판.hwp (0) | 2008.08.14 |
패키지는 만들어진 상태 그대로 프로그램에서 사용할 수 있다. 그러나 대부분의 결루 패키지는 JAR파일로 압축하여 이용하게 된다 . 이렇게 압축하여 사용하는 것이 소스를 배포하거나 이용할 때 훨씬 편리하기 때문이다. JAR파일이란 ZIP파일과 같은 압축 파일의 일종인데, 자바에서 기본적으로 지원하는 압축 포맷이 바로 JAR 이다. 사용방법은 다음과 같다.
jar -cvf '압축파일이름' '소스파일이름'
만일 A.class와 B.class 파일을 pre.jar 파일로 압축하기를 원한다면, 콘솔 창에서 다음과 같이 입력하면 된다. 물론 A.class 와 B.class 파일이 위치한 디렉토리에서 실행해야 한다.
jar -cvf 'A.class' 'B.class'
이제 만들어 놓은 패키지를 JAR 파일로 압축해 보자. 패키지를 압축할 때는 디렉토리의 구조도 그대로 압축해야 하기 때문에 다음과 같이 com 디렉토리를 통째로 압축하는 것이 가장 좋은 방법이다.
jar -cvf user.jar com
정상적으로 압축을 실행했다면 현재 디렉토리에 user.jar 파일이 생성되었을 것이다. 이렇게 압축된 패키지를 프로그램에서 이용하려면 CLASSPATH에 이파일의 결로만 설정하면 포한된 모든 패키지와 클래스를 사용할 수 있게 된다.
user.jar 파일의 경로를 CLASSPATH에 추가시켜보면 C:/LIB/user.jar라고 가정하면 CLASSPATH에는 다음과 같은 내용이 추가되어 있어야 한다.
CLASSPATH = .;c:/LIB/user.jar;
CLASSPATH를 설정한 후에는 반드시 콘솔 창을 다시 띄워주기 바란다. 클래스 패스의 설정이 완료되면 외부 패키지를 자바의 기본패키지와 동일한 방법으로 사용할 수 있다.
#패키지 사용시 주의할 점#
import문을 사용할 때 *를 사용하면 패키지 내에 포함되어 있는 모든 클래스를 사용할 수 있지만, 그 패키지 내에 존재하는 다른 패키지는 사용할 수 없다. 다음 그림은 실제 자바에서 사용되는 util 패키지의 일부분이다.
ZipFile 클래스와 JarFile 클래스는 구조상 java.util 패키지에 포함되는 것처럼 보이지만, 사실상 이들은 완전히 별개의 패키지로 구분된다. 그래서 import java.util.*; 을 이용해도 Date 클래스만 사용이 가능하고 ZipFile 과 JarFile 클래스는 사용할 수 없다. 이들을 사용하기 위해서는 같은 패키지로 모두 import 해 주어야 한다.
import java.util.*;
import java.util.zip.*;
import java.util.jar.*;
pulic class Test{
public void method() throws Exeption{
Date date = new Date();
ZipFile file1 = new ZipFile("testFile.zip");
JarFile file2 = new JarFile("testFile.jar");
}
}
또 한가지 주의할 점은 각기 다른 패키지에 포함되어 있는 동일한 이름의 클래스를 사용할 때이다. 실제로 자바의 Date 클래스는 java.util.Date 와 java.sql.Date의 두 가지 종류가 존재한다. 물론 이 둘은 전혀 다른 클래스이다. 만일 이 둘 둥에 어느 하나의 패키지만 import 되어 있다면 아무 문제도 발생하지 않지만, 두 패키지가 모두 import되어 있다면 Date 클래스를 사용할 때 문제가 발생한다.
import java.util.*;
import java.sql.*;
public class Test{
public Test{
Date date = new Date(); //에러
}
}
소스에서 사용된 Date 클래스가 어떤 패키지에 포함되어 있는 클래스인지 컴파일러는 판단할 수가 없다. 이럴 땐 명시적으로 패키지의 이름을 클래스의 이름과 함게 사용해야만 한다.
import java.util.*;
import java.sql.*;
public class Test{
public Test{
java.util.Date date = new java.util.Date(); //정상
}
}
'My work space > Java' 카테고리의 다른 글
객체직렬화 Serializable (0) | 2008.08.14 |
---|---|
[아시나요?]static만이 가능한 몇가지 특징 (0) | 2008.08.14 |
쓰레드 구구단 예제 입니다 (0) | 2008.08.14 |
scjp(내용정리)_수정판.hwp (0) | 2008.08.14 |
자바를 자바답게 하는클래스[Collection] (0) | 2008.08.14 |
==를 자바의 기본 변수에 사용할 경우는 매우 잘 작동하지만, 이것을 객체에 사용하면 조금 이상한 동작을 한다.
String st1 = "abc";
String st2 = "abc";
System.out.println(st1==st2); //XX1
String st3 = new String("abc");
String st4 = new String("abc");
System.out.println( st3 == st4 ); //xx2
System.out.println( st1 == st3 ); //xx3
출력결과는 다음과 같다.
xx1 true
xx2 false
xx3 false
==를 객체에 사용하면 단순히 메모리의 주소만을 비교한다는 사실은 이미 알고 있을 것이다. xx1행의 결과가 true인 이유이기도 하다. 그런데 xx2번부터 문제가 발생한다. 분명히 같은 문자열을 가지고 있으나 결과는 false이다. = 가 단순히 메로리의 주소만 비교하기 때문에 비록 같은 내용의 문자열일지라도 메모리의 주소가 다르면 앞과 같이 잘못된 결과를 출력하게 된다. 그래서 객체의 값을 비교할 때는 ==를 사용하지 않고 equals()메소드를 사용한다.
equals() 는 모든 클래스의 시조인 Object 클래스의 메소드이기 때문에 어떤 클래스라도 이 메소드를 사용할 수 있다. 그러나 Object 클래스에 선언되어 있는 equals() 메소드는 ==와 같이 메모리의 주소만 비교할 뿐이다. 이렇게 Object 클래스의 euqals()메소드가 단순히 주소만 비교하는 이유는 '같다'라는 기준이 각 객체마다 다르기 때문이다. 컴퓨터에서 '같다'는 의미 CPU의 속도가 같음을 나타낼 수 있고. 자동차에서 '같다'는 의미는 차량의 색상이나 모델이 같음을 나타낼 수도 있는 것이다.
이렇듯 객체마다 그 의미가 달라지기 때문에 Object 클래스에서는 equals() 메소드를 정확하게 구현할 수 없는 것이다. 그래서 객체에 equals() 메소드를 재대로 사용하기 위해서는 그 클래스에 맞게 equals() 메소드를 오버라이딩해 주어야만 한다. 즉객체를 정확하게 비교하기 위해서는 그 클래스에 맞게 equals() 메소드를 오버라이딩해 주어야만 한다. 즉 객체를 정확하게 비교하기 위해서는 그에 맞는 equals() 메소드를 만들어 주어야 한다 . String 클래스의 equals() 메소드도 문자열을 비교할 수 있도록 오버라이딩한 후에 사용하는 것이다. 다음 예문은 String 클래스의 실제 equals() 메소드이다.
public boolean equals ( Object anObject ) {
if ( this == anObject ) {
return true;
}
if( anObject instanceof String ) {
String anotherString = (String)anObject;
int n = count;
if ( n == anotherString.count ) {
char v1[] = value;
char v2[] = anotherString.value;
int i = offset;
int j = anotherString.offset;
while ( n-- !=0 ) {
if ( v1[i++] != v2[j++] ) {
return false;
}
}
return true;
}
}
return false;
}
----------------------------------------------
Object type임을 다시한번 확인
'My work space > Java' 카테고리의 다른 글
자바를자바답게하는클래스[StringTokenizer클래스] (0) | 2008.08.14 |
---|---|
자바를자바답게하는클래스[StringBuffer클래스] (0) | 2008.08.14 |
자바를자바답게하는클래스[String클래스] (0) | 2008.08.14 |
JAVA Garbage Collection에 대한 소개와 메모리 Tuning (0) | 2008.08.14 |
[아시나요?]main()메소드에 관하여 (0) | 2008.08.14 |
지금까지 아무 생각 없이 사용하고 있는 main()메소드에 대하여 알아보자
public static void main(String [] arg)
자바에 존재하는 모든 메소드나 변수는 모두 클래스 또는 객체와 함께 사용해야만 한다. sin()메소드의 경우 Math.sin()과 같이 클래스와 함께 사용하는 것은 가능하지만 sin()메소드만 독립적으로 호출할 수는 없다. 그런데 여기에는 하나의 예외가 존재하는데 바로 main() 메소드이다. main() 메소드는 어떤 클래스나 객체와 함께 사용되는 것이 아니라 자바 가상머신에 의해서 단독으로 호출되는 유일한 메소드이다. 이 말의 의미를 잘 생각해 보면 main() 메소드가 가상머신 , 즉 외부의 어떤 곳으로 부터 호출을 당한다는 사실을 알 수 있다. 즉 외부에서 main() 메소드를 호출할 수 있어야 하기 때문에 main() 메소드는 public 으로 선언하는 것이다.
자바 가상머신에서 main() 메소드를 호출하기 위해서는 main() 메소드가 메모리에 상주하고 있어야만 한다. 그리고 다른 어떤 객체보다도 먼저 실행되어야 하기 때문에 main() 메소드를 static 으로 선언하는 것이다.
main() 메소드는 결과값을 리턴하지 않기 때문에 리턴형을 void로 선언한다.
마지막으로 main() 메소드의 인자로 사용하는 String [] args는 자바 프로그램을 실행할 때 입력되는 문자열을 포함하고 있다. 더 자세히 말하면 클래스명 다음에 입력하는 데이터를 문자열로 저장하고 있는 것이다. 다음과 같이 프로그램을 실행시켰다면 args[0] = test1, args[1] = test2, args[2] = finaltest문자열이 포함된다.
C:\>java CommandLine test1 test2 finaltest
##Command.java##
public class CommandLine {
public static void main(String [] args) {
/* 배열 args의 내용을 출력 */
for(int i=0 ; i< args.length ; i ++) {
System.out.println("args[" + i + "] = " + args[i] );
}
}
}//end class CommandLine
##실행결과##
args[0] = test1
args[1] = test2
args[2] = finaltest
명령어 라인의 입력이 배열 args 에 순서대호 포함되어 있는 것을 확인할 수 있다. 그리고 args는 변수명이기 때문에 언제나 변경이 가능하다.
'My work space > Java' 카테고리의 다른 글
자바를자바답게하는클래스[String클래스] (0) | 2008.08.14 |
---|---|
JAVA Garbage Collection에 대한 소개와 메모리 Tuning (0) | 2008.08.14 |
[아시나요?]API 문서의 구조 (0) | 2008.08.14 |
[아시나요?]변수의 초기화 (0) | 2008.08.14 |
[아시나요?]자바가 메소드를 찾는 방법 (0) | 2008.08.14 |
혹시 자바의 API문서를 본 적이 있는가? 대부분이 JDK를 설치 할 때 한번 본 것이 전부라고 생각되는데, 이제부터는 이 문서를 좀더 자주 사용하기 바란다. API 문서는 설치 디렉토리 \api\index.html 파일을 실행시킴으로써 살펴볼 수 있다.
API 문서는 크게 세 부분으로 나뉘어 있다. 1번(왼쪽 위쪽)에는 자바의 모든 패키지 목록이 나와 있고, 2번(왼쪽 아래쪽)은 1번에서 선택한 패키지의 클래스가 나열되어 있다. 3번(오른쪽 큰 부분)은 선택한 클래스에 대한 설명과 함께 클래스의 상속관계, 생성자와 메소드에 대한 자세한 설명을 볼 수 있다.
'My work space > Java' 카테고리의 다른 글
JAVA Garbage Collection에 대한 소개와 메모리 Tuning (0) | 2008.08.14 |
---|---|
[아시나요?]main()메소드에 관하여 (0) | 2008.08.14 |
[아시나요?]변수의 초기화 (0) | 2008.08.14 |
[아시나요?]자바가 메소드를 찾는 방법 (0) | 2008.08.14 |
[아시나요?]객체 (0) | 2008.08.14 |
하나의 프로그램을 만들기 위해서는 많은 수의 변수를 사용하게 된다. 또한 이들 변수는 사용되는 위치에 따라 필드(멤버 변수)와 지역변수라는 이름으로 구분된다. 변수는 프로그램에서 사용하게 될 데이터를 저장하고 있으므로 언제나 유효한 값만을 가지고 있어야 한다. 만일 변수가 유효하지 않은 데이터를 가지고 있다면 프로그램은 잘못된 연산을 수행하게 된다. 이런 결과를 최대한 줄이기 위해서 자바에서 사용하는 모든 변수는 사용하기 전에 반드시 초기값을 설정해 주어야 한다.
/* 변수를 사용하기 전에 반드시 초기값을 설정해야 한다.*/
private int i = 0;
private String name = "honggildong"
private double d;
d = 43.2;
그런데 다음과 같이 초기값을 설정하지 않아도 프로그램에서 변수를 사용할 수 있는 경우가 있다.
public class Init{
private int iVar; //초기값 설정하지 않음
private String sVar; //초기값 설정하지 않음
public voids printVar(){
System.out.println(iVar); //사용가능
System.out.println(sVar); //사용가능
}
}
앞과 같이 변수에 대한 초기화를 수행하지 않고도 printVar()메소드에서 사용이 가능한 것은 필드가 명시적으로 초기화 하지 않았을 때 자동으로 초기화가 되기 때문이다. 앞에서 초기화를 수행하지 않은 변수 iVar는 0으로 sVar는 null로 초기화가 이루어지게 된다. null은 앞에서도 잠시 언급했지만 객체에 사용하게 되면 아무런 객체도 참조하지 않는다는 의미이다. 다음 표에 변수의 타입별로 자동으로 초기화되는 값을 정리해 놓았다.
String을 포함한 자바의 모든 객체는 null로 초기화 된다. 다시 한번 말하지만 이렇게 자동으로 초기화되는 변수는 필드일 경우에만 해당되는 것이다. 지역 변수는 자동으로 초기화되지 않기 때문에 사용하기 전에 반드시 면시적인 변수의 초기화 작업을 수행해야만 한다.
자동으로 초기호되는 변수의 값
데이터 형 | 값 |
byte | 0 |
short | 0 |
int | 0 |
long | 0 |
float | 0.0 |
double | 0.0 |
boolean | false |
char | NUL(아무 값도 갖지 않는다) |
String | null |
모든 객체 | null |
'My work space > Java' 카테고리의 다른 글
[아시나요?]main()메소드에 관하여 (0) | 2008.08.14 |
---|---|
[아시나요?]API 문서의 구조 (0) | 2008.08.14 |
[아시나요?]자바가 메소드를 찾는 방법 (0) | 2008.08.14 |
[아시나요?]객체 (0) | 2008.08.14 |
[아시나요?]객체 지향 언어_2 (0) | 2008.08.14 |
자바에서 메소드는 같은 이름을 사용하는 다양한 메소드가 존재할 수 있고. 여러단계의 상속 계층 속에서 오버라이딩될 수 있다. 이렇게 다양한 메소드 중에서 자바는 과연 어쩧게 원하는 메소드를 찾아내서 호출하는 것일까? 여기서 잠시 그 방법에 대해서 알아보도록 하자.
제일 먼저 자바는 지금현대 클래스에서 호출한 메소드의 이름과 인자가 일치하는 메소드를 찾는다. 만일 여기서 일치하는 메소드를 찾았다명 이 메소드를 호출하고 더 이상의 작업은 하지 않는다.
만일 현재 클래스에서 찾을 수 없다면, 이제부터는 상위 클래스에서 검색하게 되는데 이 작업은 일치하는 메소드를 찾을 때까지 계속된다. 만일 최상위 클래스까지 일치하는 메소드를 찾을 수 없다면 자바는 에러를 발생한다.
이렇게 자바는 객체의 위치(상속관계의 위치)에 따라 어느 메소드를 호출할지를 결정하는데 이를 보통 다형성(polymorphism)이라고 한다. 이러한 다형성을 가능케 하는 요인으로는 지연 바인딩(late binding)을 들 수 있는데, 이것은 컴파일 시간에 메소드호출에 관한코드를 생성시키는 것이 아니라 프로그램 실행시에 메소드를 검색하여 원하는 메소드를 호출하는 방식을 말한다. 이는 일반적인 함수 호출 방식인 정적 바인딩(static binding)과 종종 비교되곤 한다. 정적 바인딩은 컴파일 시간에 함수 호출과 관련된 모든 작업이 정해지게 된다.
'My work space > Java' 카테고리의 다른 글
[아시나요?]API 문서의 구조 (0) | 2008.08.14 |
---|---|
[아시나요?]변수의 초기화 (0) | 2008.08.14 |
[아시나요?]객체 (0) | 2008.08.14 |
[아시나요?]객체 지향 언어_2 (0) | 2008.08.14 |
[아시나요?]객체 지향 언어1 (0) | 2008.08.14 |
객체 지향 프로그래밍에서 말하는 객체란 과연 무엇일까? 객체 지행 프로그래밍이란 말그대로 프로그래밍의 모든 것이 객체를 이용하는 방향으로 진행된다는 뜻이다. 즉 객체 지향에서 모든것은 객체(Object)롤 이루어져 있다. 그런데 바로 전에 객체 지향 프로그래밍은 클래스를 중심으로 프로그래밍을 진행한다고 말한 적이 있다. 조금 헷갈릴 수도 있겠지만 모두 맞는 말이다. 객체 지향 프로그래밍은 객체를 중심으로 움직인다고 할 수도 잇고 클래스를 중심으로 움직인다고도 말할 수 있다. 이 둘 사이의 관계만 잘 정립해도 자바를 배우는데 많은 도움이 된다.
우리가 살고 있는 세상을 한번 들여다보자. 필자는 지금 지구라는 행성에서 아시아라고 하는 대륙에 대한민국이라는 나라에 살고 있다. 필자가 지금 글을 쓰고 있는 곳은 대한민국의 수도 서울이다. 필자의 방에는 컴퓨터와 시계, 어지럽게 널려져 있는 자바에 관한 책과 옷가지들로 가득차 있다. 이처럼 우리가 사는 세상은 모든 것이 표현가능한 어떤 물체로 이루어져 잇다. 지금 주위를 한번 둘러보기 바란다. 그리고 눈에 보인는 모든 것을 한번 말해보자. 책, 컴퓨터, 조명, 거실 등 여러분이 말할 수 있는 모든 것이 바로 물체, 즉 객체(Object)인 것이다.
세상은 모든 것이 객체로 이루어져 있다. 앞에서 말한 객체 지향에서 모든 것은 객체로 이루어져 있다는 말과 비슷하게 들리지 않는가? 이 두 말은 분명 같은 뜻을 내포하고 있다. 객체 지향 프로그래밍이 라는것은 결국 실제의 세계와 가장 비슷한 형태로 프로그래밍을 할 수 있는 방법을 제공해 주는 프로그래밍 방법론이다.
여기서 객체에 대해서 한번 더 생각해 보자. 우리가 일상에서 사용하는 컴퓨터, 휴대폰, 책상, 등 지칭할 수 있는 모든걸을 객체라고 말할 수 있다. 이러한 것들은 볼 수 있거나 또는 만질 수 있기 때문에 이것을 객체라고 할 수 있는것이다. 즉 그것이 존재하기 때문에 그것을 객체라고 말할 수 있는것이다. 이러한 객체에 대한 일상의 개념들을 객체 지향 프로그래밍은 그대로 언어에 반영하였다. 그러나 실제의 세계와 프로그래밍과는 엄연한 차이가 존 재하기 때문에 약간의 개념이 프로그래밍에는 더 추가가 되어 있다. 그 중 하나가 바로 클래스라는 것이다.
실제 세계에서 휴대폰이라고 말하면 그것이 무엇인지 쉽게 알 수 있지만 프로그래밍 내에서 휴대폰이라고 한다면 무엇을 말하는 것인지 알 수가 없다. 프로그래밍 내에서 휴대폰이 무엇인지를 알려주어야만 하는데, 이때 바로 클래스를 사용한다. 휴대폰이 어떻게 생겼는지, 무슨 색인지, 어떻게 동작하는지 등에 대한 자세한 설명을 담아 놓은 것이 바로 클래스이다. 즉 실제 객체 설명서, 설계서, 명세서와 같은 역할을 하는 것이 바로 클래스이다. 그리고 객체를 클래스로 전환하는 과정을 모델링이라고 하는것이다.
객체라는 것은 볼 수 있거나 만질 수 있기 때문에 그렇게 부르는 것이다. 그럼 프로그래밍 내에서는 이런 객체의 기준이 무엇일까? 조금은 어려울 수고 있는데 정답은 바로 메모리에 있다. 메모리에 해당 클래스의 실체가 존재하면 그것을 객체라고 부르는 것이다. 이것은 컴퓨터에 대한 약간의 지식을 필요로 한다.
램(메모리)이라고 부르는 것은 실제 CPU가 작업할 때 작업할 것에 대한 내용을 담아두는 곳이다. 보통 작업 테이블에 비유하곤 한다. 이곳에 작업할 내용이 올라와 있다면 CPU는 작업할 수 있을 것이고, 없다면 당연히 작업을 진행할 수 없을 것이다. 실제 세계의 객체가 볼 수 있고 만질 수 있는 것과 마찬가지로 프로그래밍에서의 객체란 바로 메모리에 그 내용이 올라와 CPU가 그것을 볼 수 있고 만질 수 있어서 작업을 할 수 있는 상태를 말하는 것이다.
다시 객체와 클래스로 돌아와서 우리가 만든 Phone 클래스는 아직 메모리에 그 실체가 존재하지 않는다. 즉 Phone 클래스의 객체가 메모리에 존재하지 않기 때문에 아직 이것을 이용할 수 없다.
그럼 지금 만든 클래스를 사용하기위해서 필요한 것은 무엇이겠는가? 물론 클래스에 대한 객체를 만들면 이것을 사용할 수 있다. 자바에서 이 작업은 간단히 new라는 키워드를 사용함으로써 수행할 수 있다. 지금 만든 클래스의 이름이 Phone 이라면 객체는 다음과 같은 방법을 통해서 만들어진다.
Phone phone = new Phone(); //phone 객체 생성
이제 휴대폰에 대한 객체가 메모리에 만들어졌으며 phone 이란 변수를 통해서 이 객체를 이용할 수 있게 되었다. 참고로 객체레 대한 변수는 레퍼런스 변수라고 한다.
'My work space > Java' 카테고리의 다른 글
[아시나요?]변수의 초기화 (0) | 2008.08.14 |
---|---|
[아시나요?]자바가 메소드를 찾는 방법 (0) | 2008.08.14 |
[아시나요?]객체 지향 언어_2 (0) | 2008.08.14 |
[아시나요?]객체 지향 언어1 (0) | 2008.08.14 |
[아시나요?]배열 (0) | 2008.08.14 |
2 . 객체 지향 프로그래밍
절차 지향 프로그래밍이 데이터화 로직을 중심으로 프로그래밍의 방향을 이끌었다명, 객체 지향 프로그래밍은 클래스를 중심으로 진행되었다. 특히 현실 세계의 사고 방식을 프로그래밍에서 그래로 사용할 수 있게 했다는 점도 빼놓을 수 없는 특징이다.
객체 지향 언어는 클래스를 프로그램의 최소 단위로 한다. 아무리 작은 프로그램이라도 최소한 하나 이상의 클래스로 이루어져 있어야만 한다. 클래스란 객체의 특징과 성질을 나타내는 변수와 이 변수를 제어할 수 있는 메소드로 이루어진 객체의 명세서이다. 즉 객체의 변수와 이 변수를 조작할 수 이쓴ㄴ 메소드가 하나의 묶음으로 존재하는 것이다. 객체를 클래스로 변환하는 과정을 객체 모델링이라고 하는데, 이에 대한 자세한 내용은 뒤에서 다시 언급할 것이다.
객체 지향 언어는 프로그램을 모듈 단위로 분리하여 개발할 수 있기 때문에 다른 사람과의 협조가 필요한 대규모 프로젝트에 적합하다. 흔히 모듈화라고 하는 이러한 특징은 하나의 프로그램을 몇 개의 기능(모듈)으로 분리해 각 기능을 따로 개발한 후에 이들을 조립함으로써 프로그램을 완성할 수 있는 방법을 제공한다. 보통 하나의 모듈은 몇 개의 클래스가 모여서 만들어진다.
그리고 이미 개발된 모듈은 다른 프로그램에서 재사용할 수 있고, 완성된 프로그램에 어떠한 수정이 필요할 경우 프로그램 전체에 영향을 끼치지 않고 수정이 필요한 모듈만 수정하면 되기 때문에 프로그램의 유지보수에도 용이하다. 또한 모듈은 복잡한 내부 구현을 사용자로부터 감추고 이 모든 모듈을 제어할 수 있는 인터페이스(메소드)만 제공해 줌으로써 사용자가 모듈에 대한 내용을 알지 못하더라도 이 모듈을 편리하게 이용할 수 있는 방법을 제공해 주었다. 즉 사용자는 모듈의 세세한 구현 사항에 대해서 전혀 알 필요가 없다
'My work space > Java' 카테고리의 다른 글
[아시나요?]자바가 메소드를 찾는 방법 (0) | 2008.08.14 |
---|---|
[아시나요?]객체 (0) | 2008.08.14 |
[아시나요?]객체 지향 언어1 (0) | 2008.08.14 |
[아시나요?]배열 (0) | 2008.08.14 |
[아시나요?]조건연산 , 비트연산 , 시프트연산 (0) | 2008.08.14 |
1.절차 지향 프로그래밍
객체 지향 이전의 프로그래밍 방법을 흔히 절차 지향 프로그래밍 또는 구조적 프로그래밍이라고 한다. 이들에 대해서 간단히 설명하자면 이들을 대단히 구조적으로, 또한 대단히 순서적으로 만들어져 있다는 것이다. 이들 최대 관심사는 얼마나 효율적으로, 얼마나 빠르게 연산을 수행할 수 있는가 하는것이다. 프로그래밍의 관심사는 얼마나 효율적으로, 얼마나 빠르게 연산을 수행할 수 있는가 하는 것이다. 프로그래밍의 관심사가 연산의 속도와 효율성에 맞춰진 것은 당시 상황이 이러한 것들을 필요로 햇기 때문이다. 그 당시에 컴퓨터화 프로그램을 필요로하건 거의 모든 분야가 엄청난 수의 계산을 필요로 하던 곳이었다. 최초의 컴퓨터라고 불리는 애니악의 용도가 탄도계산이었다는 사실만 봐도 이말은 쉽게 공감할 수 있을것이다.
이때의 컴퓨터는 일종의 계산기 정도의 역할만 수행할 수 있으면 되었다. 당연히 프로그래밍의 모든 초점은 계산을 하는데 필요한 데이터와 어떻게하면 이 데이터를 보다 빠르고 효율적으로 이용할 수 있을까에 초점이 맞춰지게 된 것이다. 프로그램의 모든 흐름은 데이터를 중심으로움직였고 이방법은 당시로서는 최상의 선택이었다. 이때의 프로그래밍이라는 것은 가장 중요한 데이터를 중심에두고 여러 함수가 이 데이터를 가공하는 일련의 작업을 수행하는 것이었다.
이들은 마치 톱니바뀌와 같이 모든 일이 곡 마추어진 순서에 의해서 진행된다. 1번함수가 데이터를 가공하면 2번함수가 다음 작업을 처리하고. 다음은 3번이나 4번 함수가 작업을 처리하게 된다. 물론 이러한 방법이 가장 좋은 연산 성능을 이끌어내기 위한 것임은 말할 것도 없다. 그리고 더 중요한 것은 이것이상의 방법을 필요로 하지 않았다는 것이다.
간단하게 지금의 계산기를 생각해보자. 사용자는 계산기를 사용하면서 많은 것을 요구하지 않는다. 단지 얼마나 빨리 정확한 계산 결과를 돌려주느냐 하는 것에만 관심을 가질뿐이다. 절차 지향프로그래밍은 이러한 요구사항을 받아들여 가장 최적의 계산능력을 수행할 수 있도록 발전되어 왔고, 프로그램의 요구사항을 처리하는데도 아무 문데가 발생하지 않았다.
그러나 문제는 컴퓨터가 점점 더 많은 일을 처리하면서 생기기 시작했다. 이제 컴퓨터는 단순히 계산만을 하던 물건에서 벗어나 데이터 처리는 물론이고 결과의 출려과 보관, 그외의 워드프로세싱이나 그래픽 등 다양한 용도로 사용되고 있다. 당연히 이들 분야에서 필요로 하는 프로그램의 양은 많아졌고. 점점 더 복잡한 프로그램을 요구하게 되었다. 프로그래밍의 양은 이전과 비교했을 때 기하급수적으로 증가 했고, 혼자서 만든다는 것은 상상할 수도 없는 엄청난 규모의 프로그램을 필요로 하게 되었다. 이때부터 절차 지향 언어는 그 한계를 드러내기 시작했다.
우선 절차 지향 언어는 짜여진 순서에 의해 일을 진행하기 때문에 만일 이들 중 어느 한 부분이 수정이나 추가, 삭제되어야 한다면 이것은 한 부분만의 문제가 아니라 프로그램 전체에 막대한 영향을 줄수있다. 또한 순서와 앞뒤과정이 중요하기 때문에 규모가 큰 프로그램을 다른 사람과 공유하여 개발하기가 힘들어지면서 절차 지향 언어는 프로그램 유지 보수의 어려움과 대규모 프로젝트 추진에서 상당한 단점을 보이게 되었다. 그리고 이러한 단점은 시간이 지날수록 치명적인 약점으로 바뀌게 되었다. 이러한 절차 지향의 단점을 보완하고자 나온 방법이 바로 객체 지향 프로그래밍이다.
'My work space > Java' 카테고리의 다른 글
[아시나요?]객체 (0) | 2008.08.14 |
---|---|
[아시나요?]객체 지향 언어_2 (0) | 2008.08.14 |
[아시나요?]배열 (0) | 2008.08.14 |
[아시나요?]조건연산 , 비트연산 , 시프트연산 (0) | 2008.08.14 |
[아시나요?]이스케이프 문자 (0) | 2008.08.14 |