블로그 이미지
'무른모'란 부드럽다라는 뜻을 가진 '무르다'라는 말과 도구, 연장을 뜻하는 '연모'라는 순 우리말의 합성어로 소프트웨어를 말합니다. seanhigher

카테고리

분류 전체보기 (161)
Blog srart (16)
Dev Center (94)
Real Life (13)
Mac life (21)
Naver life (17)
Total633,812
Today36
Yesterday88
String 은 자바에서 빼놓을 수 없는 클래스 타입의 자료형이다. 아마 String 이 없었다면, 수많은 사람들이 자바 프로그래머의 길을 포기해야 했을지도 모른다. String 에는 한가지 중요한 비밀이 숨겨져 있다.


String 데이터를 생성하는 방법.

String str1 = "문자열";
String str2 = "문자열";
String str3 = new String("문자열");

위에 있는 세개의 데이터의 차이는 무엇일까? 정답은 어느것은 같은 것이고 어느것은 다르다는 것이다. 분명히 세개의 자료형에 똑같이 "문자열"이란 데이터를 넣었는데 같은것과 다른것이 있다니... 하지만 분명 차이는 있다. String 은 클래스형의 데이터 타입이라고 했다. 그것은 그 변수가 데이터를 갖고 있는 것이 아니라, 데이터가 있는 주소값을 가지고 있다는 것이다. 또 String 은 데이터를 만들기전에 자신과 똑같은 데이터가 있는지 검사를 한뒤 똑같은 데이터가 있다면 새로운 데이터를 생성하지 않고 똑같은 데이터가 있는 그 위치를 가리키게 된다. str1의 주소값과, str2의 주소값은 동일한 것이되고, 가리키는 데이터도 같은 값인 것이다. 하지만, new 연산자를 사용할 경우에는 똑같은 데이터가 있는지 검사하지 않고 무조건 새로운 String 데이터를 만들게 된다. 가지고 있는 주소값은 다른 것이지만, 그곳에 있는 데이터를 비교하게 되면 똑같은 데이터값을 갖고 있는 것이다.


String 데이터를 비교하는 방법
일반적으로 기본형 데이터를 비교하기 위해서는 '==' 연산자를 사용해서 비교하는 것이 가능하다. 하지만, 문자열을 'str1 == str2' 와 같은 방법으로 비교할 경우에는 '문자열' 과 '문자열'이 같은지를 비교하는 것이 아니라, str1이 가지고 있는 주소값과 str2가 가지고 있는 주소값을 비교하게 된다. 물론 위의 경우에 str1 과 str2는 같은 값을 갖는다는 결과를 내겠지만, str1 == str3 의 경우에는 다르다는 결과를 낼 것이다. 그렇다면 포함되어 있는 문자열을 그대로 비교하고 싶다면?? String 클래스에 구현되어 있는 equals() 메소드를 사용하여 비교하는 것이 가능하다. str1.equals(str3) 과 같은 방법으로 비교를 하게 되면 각 데이터가 가지고 있는 실제값을 비교하여 같다는 결과 값을 반환할 것이다.


String 은 변하지 않는다.
String 클래스에는 문자열을 조작하기 위한 다양한 메소드들이 준비되어 있다. concat() 란 메소드는 원래의 스트링에 인자값으로 전달받은 스트링을 더하는 역할을 한다.

String str1 = "첫번째";
String str2 = "두번째";
str1.concat(str2);

위의 소스를 실행하면 str1 에는 어떠한 데이터가 들어 있을까? '첫번째 두번째' 라는 데이터를 생각했겠지만, str1 에는 원래의 '첫번째' 라는 데이터만 들어 있다. 그 이유는 스트링 클래스의 메소드를 통해 문자열 조작을 하게될 경우 변형된 스트링을 반환하지만, 그 값까지 변하지는 않는다는 것이다. 만일 위의 소스에서 맨 마지막 줄을

str1 = str1.concat(str2);

와 같은 방법으로 사용한다면 str1에는 변형된 데이터가 다시 대입되는 형태를 띄기 때문에 str1에는 우리가 예상했던 '첫번째 두번째' 가 저장되어 있을 것이다.

Posted by seanhigher

댓글을 달아 주세요

사계절이나, 요일, 달 등은 명확한 데이터값을 가지고 구분이 되는 데이터들 중 하나이다. 이러한 종류의 데이터들을 사용하기 위해서 변수명과 정수의 숫자들을 대입하여, 데이터들을 구분할 수 있었다. 그러나 그 값이 정수라는 것이 조금은 불편하게 느껴질 때도 있었다. JDK 5.0 에서부터는 이러한 문제들을 개선하기 위한 새로운 데이터 형을 제안하였다.


열거타입의 데이터 사용.
열거타입은 정해진 데이터를 구분하기 위해 변수명에 정수를 대입해서 사용하는 대신에, 데이터와 변수명을 동일하게 사용하게 된다. 하나의 묶음으로 선언되는 열거타입의 데이터를 자바에서는 클래스의 하나로 인식을 하고 실행하게 된다. 사계절이란 열거타입을 선언하는 방법은 다음과 같다.

enum 사계절 {
    봄, 여름, 겨울, 가을
}

언뜻 보면 배열의 선언 방법과 매우 비슷하다. 사용법이나 구성도 매우 비슷하긴 하지만, 그 값이 인덱스값이라는 점에서는 차이가 있다. 열거 타입으로 선언한 '사계절'에서 '여름'의 데이터를 사용하고 싶다면,

사계절 season = 사계절.여름;

과 같은 방법으로 선언하고 사용하는 것이 가능하다. season 이라는 변수안에 '여름' 의 열거타입 데이터가 들어가 있는 것이다.


클래스 내부에서의 열거타입.
만일 클래스 내부에서만 열거타입의 데이터를 사용하고 싶다면 클래스 내부에서 선언을 하면 된다. 하지만, 다른 클래스에서 이 열거타입의 데이터를 사용하고자 한다면, 클래스 이름을 통해 접근을 하는 것도 가능하다.

class 좋아하는것 {
    enum 사계절 {
        봄, 여름, 가을, 겨울
    }
}

좋아하는것.사계절.봄;


기본으로 생성되는 values(), valueOf() 메소드.
열거타입을 선언하고 사용하게 되면 values() 와 valueOf() 라는 메소드가 기본적으로 생성이 된다. values() 메소드는 열거타입안에 선언된 모든 데이터를 배열의 형태로 반환해주는 역할을 하게 되고, valueOf() 메소드는 열거타입 상수를 인자로 넘겨주면 그 값을 리턴해 주는 역할을 한다.


다른값을 갖는 열거타입.
열거타입의 변수를 선언하게 되면, 그 값과, 인덱스(또는 키)가 동일한 값을 갖게 된다. '사계절'에 '여름'을 저장하면 '여름' 이라는 값만을 반환하게 되는 것이다. 만일 '여름' 이라는 데이터를 호출할때 'summer' 이라는 데이터를 갖고 싶다면, 다음과 같은 방법을 활용할 수 있다.

enum 사계절 {
    봄("spring"), 여름("summer"), 가을("fall"), 겨울("winter");
    final private String name;
    사계절(String name) {
        this.name = name;
    }
    String value() {
        return name;
    }
}

위의 방법은 생성자 파라미터 값으로 각 데이터 값을 전달해 줌으로써 value() 라는 메소드로 연관된 값을 반환 받는 것이다. name 변수명이나 value() 메소드의 경우는 개발자가 임의의 이름으로 변경하여 사용하는 것이 가능하다. 이러한 방법은 열거타입을 좀더 다양하게 사용할 수 있는 방법을 제시해 줄 것이다.

Posted by seanhigher

댓글을 달아 주세요

클래스 형태의 데이터 타입을 사용하게 되면 또 하나의 막강한 기능을 사용할 수 있다. 상속을 통한 확장과, 다양한 형변환을 통해, 언제 어떤 형태로든 데이터를 사용하는 것이 가능해 진다. 물론, 변환하고자 하는 데이터형에 알맞아야 한다는 불변의 조건이 있지만...



데이터 형변환하는 캐스팅.
자바의 기본 데이터에서는 캐스팅을 통해 더 큰 형태의 데이터로 형변환을 하는 것이 가능하다. 이것은 클래스를 사용하는 데이터 형에서도 사용이 가능하다. '사람' 이라는 클래스와 이것을 확장하는 '학생' 이라는 클래스 데이터형이 있다면, '학생' 이라는 클래스 데이터는 '사람'이라는 데이터 형태로 형변환이 가능하게 된다.

학생 홍길동 = new 학생();
사람 사람1 = (사람)홍길동;

서로 다른 데이터 형이지만, 동일한 데이터 형으로 취급하여 사용하는 것이 가능하게 된다. 그리고 위에서 만든 홍길동은 '사람' 이외에도 'Object' 형태로의 형변환이 가능한데, 이것은 모든 클래스가 기본적으로 Object 를 상속받아 만들어졌기 때문이다. (자바 API 를 보면 모든 클래스가 Object 를 상속받는 다는 걸 알 수 있다.) 그렇기 때문에 모든 데이터형을 한꺼번에 처리하고자 한다면, 'Object' 의 형태로 데이터를 선언하고 사용하면 될 것이다. 하지만, 그만큼 안정성은 보장하지 못한다는 사실도 기억해야 한다.


강제적인 캐스팅 확인하기, instanceof 연산자.
사실 위와 같이 하위 클래스에서 상위 클래스로의 형변환은 궂이 선언하지 않아도 자동으로 상황에 맞추어 형변환이 이루어진다. 반대로, 하위로 형변환을 하게 될 경우에는 꼭 원하는 데이터 형으로 형변환을 선언해 주어야 한다. 하지만, 이리저리 데이터들이 이동을 하고 자주 형변환이 이루어지는 과정에서 이 데이터가 내가 생각하는 데이터가 맞는지 고민을 하게 되는 경우가 생기기도 한다. 이럴때 사용할 수 있는 것이 instanceof 연산자이다. 이것은 대상 데이터가 비교하고자 하는 데이터 형태로 형변환이 가능한지는 확인해주는 역할을 하게 된다. '사람' 타입으로 변형된 '홍길동' 을 다시 학생으로 돌려놓고 싶은데, 그것이 가능한지 알고 싶다면 다음과 같은 방법을 사용할 수 있다.

if(홍길동 instanceof 학생)
    학생 새홍길동 = (학생)홍길동;

이런 클래스의 형변환은 다양한 데이터를 좀더 효율적으로 사용할 수 있도록 해준다. '사람1' 과 '홍길동' 은 서로 다른 데이터 형으로 만들어 졌지만, 형변환으로 통일된 데이터 형을 가짐으로써 하나의 로직으로 좀더 많은 데이터를 수용하는 것이 가능해지는 것이다.

Posted by seanhigher

댓글을 달아 주세요

클래스가 존재하는 이유는 무엇일까? 이미 알고 있는 지식들로 이야기하자면, 객체를 만들어 사용하기 위해서이고, 다양한 API로 사용을 하기 위해서라고 할 수 있다. 하지만, 그런것들은 우리가 쉽게 접근할 수 없는 부분이기도 하다. 우리에게 클래스가 존재하는 가장 큰 이유는 나만의 '로봇' 들을 만들기 위해서이다.


기본형 데이터, 레퍼런스형 데이터.
자바에서는 기본적으로 쓰이는 데이터 형에는 byte, short, int, long, float, double, char, boolean 의 여덟가지가 있다. 혹시나 센스있는 사람이라면, String 이 빠져있는것에 대해서 의구심을 갖게 될 것이다. String 이 빠져있는 이유는 String 은 기본 데이터 형이 아닌, 클래스이기 때문이다. 하지만, '문자열' 이라는 데이터는 워낙에 많이 사용되는 것이라 무의식중에 기본 데이터 형이 되어버린 것이다. 그렇다면 String 이 클래스라는 소리는 무엇일까? String 이 클래스라는 이야기는 우리가 만들 수 있는 모든 클래스들이 String 처럼 데이터형으로 사용될 수 있다는 이야기가 된다.


더욱 확장된 데이터형.
하지만, 우리가 일반적으로 사용하는 데이터형 외에도 일부러 클래스를 만들어 데이터형으로 사용할 필요가 있을까? 다음과 같은 경우를 생각해 볼 수 있다. 한 반에 있는 학생들의 데이터를 저장하고자 한다. 각 학생들에게는 국어, 영어, 수학, 과학 등의 점수와 합계, 평균등이 포함되어 있다. 기본 데이터 형으로 표현을 하고자 하면, 변수를 선언하는 것만으로도 엄청나게 많은 양의 메모리를 소모하게 된다. 배열로 묶어서 표현을 하고자 한다고 해도, 평균과 같이 소수의 수를 사용하는 경우에는 데이터 형이 달라서 묶을 수가 없다. 클래스를 사용한다면 쉽게 묶을 수 있다.

class 학생 {
    int 국어;
    int 영어;
    int 수학;
    int 합계;
    float 평균;
}



클래스 데이터형을 사용하기.
클래스로 만들어 놓은 데이터 형은 어떻게 사용할 수 있을까? 새로운 클래스 객체를 선언하고, 그 안에 데이터를 넣는 형식으로 사용하는 것이 가능하다.

학생 홍길동 = new 학생();

국어, 영어, 수학등의 점수를 넣기 위해서 '.' 연산자를 통해 클래스의 맴버 변수에 접근을 하는 것이 가능하다.

홍길동.국어 = 80;
홍길동.영어 = 70;
홍길동.수학 = 90;
홍길동.합계 = 홍길동.국어 + 홍길동.영어 + 홍길동.수학;

이 클래스의 데이터 형을 배열에 넣어서 사용을 하게 될 경우에는 더욱 더 다양한 사용이 가능하다. 수백명이나 되는 학생들을 한꺼번에 관리하는 것이 가능한 것이다. 클래스형의 데이터를 가지고 배열을 선언해 사용할 경우에는 한가지 주의해야 할 점이 있는데, 배열을 선언한 후에, 객체를 생성해 주어야 한다는 것이다.

학생[] 우리반 = new 학생[30];
학생[0].국어 = 80;

위와 같은 방법으로 배열을 생성하고, 데이터를 넣으려고 하면 에러가 발생한다. 클래스형의 데이터를 가지고 배열을 생성한다는 것은 단지 그만큼의 공간을 준비하는 작업뿐이기 때문에, 그 안에는 아무런 정보가 들어가 있지 않다. '학생[0].국어' 라는 이름으로 데이터에 접근해서 값을 대입하려고 해도, '학생[0].국어'라는 변수가 없기 때문에 접근을 할 수 없는 것이다.

학생[] 우리반 = new 학생[30];
학생[0] = new 학생();
학생[0].국어 = 80;

위와 같이 객체를 생성하는 과정을 거친 후에야 아무런 오류 없이 데이터를 사용할 수 있는 것이다.


기본데이터형과 레퍼런스 타입의 차이점.
이 두가지 데이터의 차이는 데이터를 어떻게 가지고 있느냐이다. 기본 데이터형은 그 변수 자체에 데이터를 가지고 있지만, 레퍼런스 타입은 데이터값을 가지고 있는 위치의 주소값을 가지고 있다. 그래서 포함된 데이터에 접근하기 위해서는 이차이상의 접근을 통해서 데이터 값을 갖게 되는 것이다.

Posted by seanhigher

댓글을 달아 주세요

생물들이 공통적으로 지녀야 하는 특징은 무언가를 먹어야 한다는 것이다. 그 행동이 어떻게 정의되는것인지는 확실하지는 않지만, 무언가를 먹음으로써 그 삶을 유지시켜나가게 된다.


꼭 있어야 하는 메소드.
생물이라는 클래스를 상속받는 것들은 '먹는다' 라는 기능을 필수적으로 갖어야 한다. 생물로써 먹는것이 이루어지지 않는다면 그것은 생물이라고 부를 수 없는 것이다. 이렇게 생물을 상속받는 클래스로 꼭 필요한 기능을 정의해 놓은것이 있는데, 이것을 추상클래스라고 한다. 추상클래스는 추상메소드를 가지고 있으며(추상 메소드가 없는 경우도 있다), 일반적인 메소드도 포함하고 있다. 일반적으로 상속이 가능하며, 꼭 필요한 것에 대해서는 강제적인 구현을 요구하는 것이다. 추상 메소드가 없는 추상 클래스의 경우는 객체의 생성을 방지하기 위해서 추상클래스로 선언하기도 한다.


추상클래스의 선언과 사용.
추상클래스는 abstract 키워드를 사용하여 표현할 수 있다. 그리고 메소드에도 동일하게 abstract 키워드를 선언함으로써 추상메소드로 선언을 할 수 있다.

abstract class A {
    abstract void display();
}

추상클래스는 위와 같이 abstract 키워드를 붙이는 것만으로 선언이 가능하지만, 추상 메소드의 경우에는 약간 방식이 다른다. abstract 키워드를 선언한후, 메소드의 내용을 구분하는 부분을 표시하지 않고 세미콜론(;) 을 통해서 메소드 시그니쳐만으로 선언을 하게된다.


추상클래스의 상속.
추상 클래스를 상속받는 클래스는 추상메소드를 꼭 구현해 주어야 한다. 그렇지 않으면 오류가 발생하게 된다. 그리고 추상메소드만을 포함하고 있는 인터페이스라는 형태가 있는데, 이것은 자바의 다중상속을 가능하게끔 연결을 시켜주는 연결고리와 같은 역할을 하게 된다.

Posted by seanhigher

댓글을 달아 주세요

먹는다라는 행동은 모든 생물에게 있어서 동일하게 적용이 된다. 하지만, 먹는 모양새가 모두에게 동일한 것은 아니다. 동물들같은 경우는 씹어먹는다고 할 수 있고, 식물들 같은 경우는 먹는다기 보다는 흡수에 가깝다고 할 수 있다. 이들이 모두 생물이라는 사실과, 먹는행동을 한다는 것은 같다.


오버라이딩의 개념.
오버라이딩은 쉽게 말하면 덮어쓰기를 하는 것이다. 상위 클래스를 상속받은 하위 클래스에서 상위클래스가 가지고 있는 메소드를 재 정의하여 자신에게 맞게 사용되는 것을 말한다. 만일 '생물' 이라는 클래스가 '먹는다' 라는 메소드를 가지고 있다고 가정해보자. '동물' 클래스와 '식물' 클래스는 생물을 상속받아서 생성이 가능하다. 하지만, 이것들이 '먹는다'라는 메소드를 통해 동일한 행동을 하기에는 조금 무리가 있다. 똑같이 먹는 행동을 하기는 하지만, 그 행동에는 현저한 차이가 있는 것이다. 이렇게 상속을 받지만 그 행동이 다를 경우 자신의 객체에서 새롭게 정의를 하는 기능이 메소드 오버라이딩이다.


메소드 오버라이딩 하기.
메소드 오버라이딩을 하기 위해서는 상위 클래스와 동일한 타입의 인자와 수를 일치 시킨 후 메소드를 정의하면 된다.

class 생물 {
    public void 먹는다() {
        에너지를 흡수한다;
    }
}

class 동물 extends 생물 {
    public void 먹는다() {
        음식물을 섭취한다;
    }
}


메소드 오버라이딩은 왜 필요한가??
궃이 메소드 오버라이딩이 없어도, 자신이 필요한 메소드를 생성하고, 선언해서 사용하면 별다른 문제는 없다. 그냥 선언해서 사용하면 되니까... 하지만, 메소드 오버라이딩은 매우 중요한 요소중의 하나이다. 이것은 자바에서 추구하는 다형성에서 그 원인을 찾을 수 있다. 자바에서는 다형성을 통해 다양한 클래스들이 서로 상관 관계를 갖게 되고, 각 클래스에 대해서 잘 알지 못하더라도, 상속과, 구현을 통해서 이미 만들어진 것들을 사용하는 것이 가능하다. 그리고 이 다형성의 특징 중 하나는, 동일한 Object 타입으로 묶을 수 있다는 것이다. 클래스의 형태를 따르는 각 객체들을, 그것을 상속받는 상위 클래스의 형태로 묶음으로써 좀더 편리하게 각 객체들을 관리하는 것이 가능한 것이다. 더욱이 중요한 사실은 이 객체들은 동일한 '먹는다' 라는 메소드를 실행한다고 할찌라도, 자기 자신에게 맞는 동물의 '먹는다'라는 메소드를 실행할 수 있게 된다. 각 클래스마다 다르게 구현을 할 필요없이, 메소드 오버라이딩을 통해서 한번에 로직을 작성하는 것이 가능한 것이다.

Posted by seanhigher

댓글을 달아 주세요

클래스를 사용하기 위해서는 객체화 시켜 이용을 하게 된다. 하지만 한가지가 아쉽다. 모든 객체에 상관없이 사용할 수 는 없는 것일까 하는 것. 만일 비디오를 대여하는 프로그램을 만들고자 할때, 아무리 많은 비디오 객체를 만들어도 그비디오의 재고는 객체와 상관없이 유지되어야 한다.



객체가 아닌 클래스에 소속된 것들.
클래스의 변수를 사용하기 위해서는 객체를 생성해야 하고, 그 객체를 가지고 각 맴버 변수들과 메소드에 접근을 하는 것이 가능하다. 같은 클래스의 변수들과 메소드일찌라도, 생성된 객체가 다르다면 전혀 다른존재가 되는 것이다. 서로간에 인자값으로 전달해주지 않는다면 서로 다른 객체간에 데이터값을 유지시킬 수 없게 된다. 하지만, 한가지 방법이 있다. 바로 정적 필드, 정적 메소드를 선언하는 것이다. 이렇게 정적으로 선언하게 되면, 이것들은 객체에 소속되는 것이 아니라, 그것이 선언된 클래스에 소속이 되는것이다. 객체로부터의 접근이 아닌, 클래스로부터 접근이 가능하게 된다.


정적 필드, 정적 메소드의 선언.
정적 필드, 정적 메소드를 선언하기 위해서는 필드와 메소드 앞에 static을 선언해주면 된다.
class A {
    static int a = 0;
    static void display() {
    }
}

위에서 선언된 a변수에 접근을 하기 위해서는 클래스의 이름인 A로 접근을 해야 한다. 객체를 생성하지 않은 상태에서 클래스의 멤버변수를 사용하는 것이 가능하다. a의 변수를 사용하기 위해서는 A.a라는 방식으로 사용할 수 있다. 동일하게 메소드에서도 A.display() 라는 이름으로 객체를 생성하지 않은체로 사용하는 것이 가능하다.


정적필드를 사용하면 좋은점과, 그렇지 않은 점.
이렇게 정적 필드를 사용하게 되면, 하나의 클래스에서 같은 데이터형에 접근을 하는 것이 가능하다. 변수를 사용하기 위해서 객체를 생성하지 않아도 되기 때문에 좀더 손쉽게 사용하는 것이 가능하다. 하지만, 이렇게 정적으로 선언한 필드의 경우에는 프로그램의 실행하면서 최초로 호출됨과 동시에 일부의 메모리를 할당받기 때문에 너무 남용하는 것은 좋지 않다. 그렇기 때문에 정적 필드를 사용하는 경우는, 그 클래스객체와 상관없이 모두에 동일한 값을 갖고자 할때, 상수를 변수처럼 사용하고자 할때 사용되게 된다.

Posted by seanhigher

댓글을 달아 주세요

클래스를 사용하기 위해서는 객체를 생성해야 사용하는것이 가능하다. 그리고 객체가 생성될때 클래스에서 꼭 이루어지는 것이 있는데, 바로 생성자를 호출하는 것이다. 생성자가 꼭 챙겨주지 않는다면, 생성자가 없다는 에러메시지를 만나도 적절하게 대응하지 못하는 불상사가 발생하고 말 것이다.


생성자는??
각 클래스의 객체가 생성될때마다 그 클래스 객체를 사용하기 위해서 꼭 선행되어야 할 일들이 있다. 하지만, 매번 그러한 일들을 일일이 선언해 주고 실행해 주어야 한다는 것은 굉장히 불편한 일이고, 비 합리적인 일이기도 하다. 이것은 자바가 추구하는 방법에 굉장히 위배되는 일이기도 하다. 그래서 자바의 클래스에는 이러한 역할을 해주는 것이 있는데, 이것이 바로 생성자이다.


생성자 사용하기.
생성자를 사용하는 방법은 매우 간단하다. 단지 클래스의 이름과 동일한 메소드를 만들고, 그 안에 하고자 하는 로직을 담아내면 된다.

class A {
    public A() {
    }
}


생성자 오버로딩.
생성자를 사용하는 또 하나의 이유는 동일한 클래스에서 다른 인자의 형태를 받기 위해서이다. 클래스의 생성자는 단 하나만 존재하는 것이 아니라, 각 인자의 타입과 갯수에 따라 수많은 종류가 존재하기도 한다. 이렇게 다양한 생성자를 갖는 것을 생성자 오버로딩이라고 한다. 인자의 타입과 갯수에 따라 다른 생성자가 호출되지만, 아무것도 정의되지 않을 경우에는 아무런 인자값을 갖지 않는 디폴트 생성자가 호출된다. 클래스를 만들때는 아무런 타입이 없는 디폴트 생성자를 선언해주는 것이 좋은데, 왜냐하면, 상속의 관계가 있을 경우 하위 클래스에서 맞는 생성자가 없을 경우 상위의 디폴트 생성자를 호출하기 때문이다. 만일 디폴트 생성자가 없다면 에러가 발생하게 되는데, 이런 생성자 관련 에러는 찾기가 힘든 경우가 대부분이다.

class A {
    public A() {}
    public A(int i, int j) {}
    public A(String str) {}
}



Posted by seanhigher

댓글을 달아 주세요

상속의 방법은 부모의 능력을 자식들에게 전가해줄 수 있는 매우 좋은 방법중의 하나이다. 하지만 단 한가지 아쉬운점이 있다면, 단 하나의 클래스에서만 상속이 가능하다는 것이다. 아빠의 능력을 받게 된다면, 엄마의 모습을 갖을 수는 없는 것이다...



다중상속.
분명 상속은 단 하나의 클래스에서만 이루어지는데... 다중상속이란 말이 나오는 까닭은?? 단 하나의 클래스를 상속하는 것만으로는 자바의 무한한 확장성을 무시하는 처사밖에 되지 않는다. 그래서 약간은 편법적인 방법으로 하나 이상의 클래스에서 상속이 이루어지게끔 만들어 주고 있다. 대신에, 불법적인 방법을 사용하는 만큼 조금은 더 제약이 다른다는 사실을 명심해야 한다.


인터페이스.
다중 상속을 하기 위해서는 우선 가장 기본이 되는 골격을 상속받은 후, 필요한 맴버 필드나 메소드를 가지고 있는 클래스의 형태를 추가하는 형태를 갖게 된다. 하지만, 이것은 상속이 아닌, 인터페이스라는 형태로 제공된다. 이 인터페이스는 일반적인 클래스와는 다르게 모든것에 추상 메소드로 이루어져 있다. 모든 메소드가 추상 메소드로 구현되어 있다는 것은 이것을 상속받는 클래스들은 인터페이스 클래스에 속해있는 모든 메소드에 대해서 구현을 한 후에 사용을 할 수 있다는 것이다. 만일 동물이라는 클래스를 상속받은 고양이라는 클래스가 있다고 하자. 이 고양이라는 클래스는 날카로운 이빨, 줄무늬 라는 클래스들은 추가적으로 상속받으면서 호랑이의 모습을 갖게 된다. 날카로운 이빨 클래스에 속해 있는 빠른 움직임, 물어뜯기의 메소드들은 필수적으로 구현을 해야지만 가능하다는 사실이다.


인터페이스 다중 상속의 방법.
동물을 상속받는 고양이의 다중 상속은 다음과 같이 표현할 수 있다.

class 고양이 extends 동물 implements 날카로운 이빨, 줄무늬 {
    ... ...
    public void 빠른 움직임() {}
    public void 물어뜯기() {}
}

다중 상속을 위해서는 아무런 내용이 없더라도, 그것을 꼭 구현해 주어야 하는 번거로움이 있다. 하지만, 이 번거로움이 있을지라도, 충분히 다중상속의 확장성과, 가능성은 개발자로 하여금 꼭 필요한 기능임을 인식하게 만들어준다.

Posted by seanhigher

댓글을 달아 주세요

자바의 모든 클래스는 오브젝트 클래스로 부터 상속을 받아 만들어져 있다. 이것은 자바를 이용하는데 있어서 하나의 중요한 요점이 되기도 한다. 한 부모의 아래에 있다는 것은 모두 같은 유전자를 갖고 있다는 것. 동일한 속성을 사용할 수 있다는 것이다!



상속.
생물이라는 집단이 있다. 이 생물이라는 집단의 아래에는 동물도 있고, 식물도 있다. 동물과 식물은 살아있고, 자라나고, 무언가를 먹고 배설한다는 공통점을 가지고 있다. 이것은 생물이라는 상위 개념에서 그것을 그대로 가져온 것이기도 하다. 그리고 동물에는 조류, 양서류, 포유류, 설치류 등등의 다양한 종류들이 있다. 이것들은 하나같이 동물이 가지고 있는 특징을 그대로 가지고 있다. 이렇게 어떠한 객체에서 공통된 특징을 가지고 있는 것들을 상위 클래스라고 하며, 상위 클래스가 가지고 있는 특징들을 그대로 받아 새로운 객체고 구분지어지는 것을 상속받는다고 한다. 동물과 식물은 생물을 상속받았으며, 조류, 양서류, 포유류등은 동물을 상속받아 이루어진 것들이다.


상속의 표현.
동물이 생물을 상속받아 표현하는 것이라면 이렇게 표현을 할 수 있다.

class 동물 extends 생물 {
    ... ...
}

동물은 생물을 상속받았기 때문에 생물이 가지고 있는 모든것들을 그대로 사용하는 것이 가능하다. 그리고, 원래 있던것을 조금 변형시켜 사용하는 것도 가능하게 된다. 그리고 동물과 생물의 특징들을 개별적으로 사용할 수 있도록 super 와 this 라는 구분자를 제공하기도 한다. 동일한 이름의 메소드나 멤버 필드가 상속관계에 있는 두개의 클래스에 있을 경우에 super 는 그 상위 클래스의 맴버를 지칭하고, this 는 현재의 클래스에 속해 있는 멤버들을 지칭하게 되는 것이다.


자바의 최상의 클래스 Object.
자바의 모든 클래스는 하나의 클래스로부터 시작이 된다. 그 최 상위 클래스에는 Object 클래스가 자리하고 있는데, 이것은 자바의 무한한 확장성을 시사하는 바이기도 하다. 단 하나의 클래스로 부터 시작되었지만, 지금에 와서는 거의 대부분의 기능들을 구현하고, 지금도 수많은 개발자들에 의해서 점점 발전해 나가고 있는 것이다. 그리고 하나의 클래스로부터 분리된 자료형은 최상위 자료형인 Object 형을 갖으면서 모든 자료를 동일하게 평가하고, 기능을 부여할 수 있게 된 것이다.

Posted by seanhigher

댓글을 달아 주세요

  1. 2010.07.26 03:00 닉쑤  댓글주소  수정/삭제  댓글쓰기

    오랫만에 듣는 말이네요. 상속. ㅋ

    저 개념이 참 처음에는 왜그리 낯선지.. ㅋ
    그렇구나 하면서도 막상 프로그램 짤 떄는 햇갈리고. ㅎ

    포스팅만 모아놔도 책 쓰시겠어요. ㅎ 신입생들이 공부해도 되듯.
    잘 보고 갑니다~

최근에 달린 댓글

글 보관함