Search

반응형

'Java'에 해당되는 글 52건

  1. 2020.04.23 [자바]super, this, super(), this() 키워드에 대해 알아봅니다.
  2. 2020.04.19 [자바]조건문 if-else문과 switch-case문, 예제로 살펴보기.
반응형

자바를 처음 접한 게 1999년도이니 20년이 훌쩍 넘었네요.

한참 개발을 할때가 jdk1.4였고 다시 한번 되짚어보고 개념 잡기를 위해 공부 중인 노땅 개발자입니다.

처음 객체지향 프로그램을 접하고 공부하면서 super와 this 사용에 혼동이 종종 있었답니다.

개념은 알겠는데 JSP를 이용해 UI쪽 개발을 자주 하던 터라 막상 자주 사용할 일이 없기도 했지만 가끔 사용법에 어려움을 느끼곤 했었답니다.

사실 별거 없는데 말이죠. ㅋㅋ

개념을 다시 잡고 되돌아보는 기분으로 정리해봤습니다.

그럼 시작해보겠습니다.

객체지향 프로그램을 하다 보면 상속을 하게 됩니다. extends 키워드를 사용해서 부모 클래스(슈퍼클래스)를 상속받게 되는 거죠.

super는 현재 슈퍼클래스를 상속받은 서브클래스에서 슈퍼클래스에서 상속받은 클래스 변수와 메서드에 접근하기 위해 사용합니다.

사용법은 super에 .을 붙이고 슈퍼클래스의 메서드를 실행하거나 변수에 값을 할당하면 됩니다.

상속된 변수와 메서드를 활용해서 추상화된 기능을 사용할 수 있는 겁니다.

this는 현재 인스턴스화 된 객체의 자신을 가리키게 됩니다.

사용법은 super와 같습니다.

다음 예를 통해 확인해볼게요.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class TiboySuper {
    protected String item;
    protected int price;
    
    public TiboySuper(String nm, int p) {
        item = nm;
        price = p;
    }
    
    public String getInfo() {
        String rtn = "super : " + item + ", " + price;
        return rtn;
    }
 
}
cs

우선 슈퍼클래스(TiboySuper)를 간단하게 만들었습니다. 

클래스 변수로 item과 price를 정의하고 생성자에서 초기화했습니다.

nm과 p로 입력 파라미터를 선언한 생성자를 직접 만들었습니다.

그리고 getInfo() 메서드를 만들어서 정보 출력을 만들었습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class TiboySub extends TiboySuper {
    protected int cnt;
    
    public TiboySub(String item, int price, int cnt) {
        super(item, price);
        this.cnt = cnt;
        // TODO Auto-generated constructor stub
    }
    
    public String getInfo() {
        String rtn = "sub : " + item + ", " + price + ", " + cnt;
            return rtn;        
    }    
    
    public void showData() {
        System.out.println(super.getInfo());
        System.out.println(this.getInfo());
    }
}
cs

슈퍼클래스인 TiboySuper를 상속받은 서브클래스인 TiboySub클래스입니다.

슈퍼클래스의 두 변수와 메소드 1개를 이어받게 됩니다.

그리고 cnt라는 변수 하나를 추가 선언했네요.

선언된 변수 명인 cnt와 생성자의 파라미터 명인 cnt가 같습니다.

그래서 생성자에서 현재 객체의 변수인 cnt에 파라미터로 넘어온 cnt를 할당해야 하는데 이름이 같기에 this 접근자를 사용하게 됩니다.

슈퍼클래스에서 입력 파라미터 2개를 받은 생성자를 구현했기에 상속받은 서브클래스에서도 호출을 해야 합니다.

그래서 서브클래스의 생성자에서 파라미터를 받고 그대로 슈퍼클래스의 생성자를 super를  사용해 호출했습니다.

또한 showData()를 사용해서 슈퍼클래스의 메서드(super.getInfo())와 서브클래스의 메서드(this.getInfo())를 호출하도록 구현했습니다.

1
2
3
4
5
6
7
8
9
10
public class TiboyTest {
 
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        TiboySub tSub = new TiboySub("apples"10005);
        
        tSub.showData();
    }
 
}
cs

 

메인 메서드에서 서브클래스의 객체 tSub를 생성 후 인스턴스화 했습니다.

그리고 서브클래스의 showData() 메서드를 호출하게 됩니다.

결과는 어떻게 나올까요?

super : apples, 1000
sub : apples, 1000, 5

예상한 대로 나왔나요?

정리해보겠습니다.

this()는 현재 인스턴스화 된 객체의 생성자를 호출하게 됩니다.

바로 public TiboySub(String item, int price, int cnt) {} 겠지요?

생성자에서 해당 서브클래스의 변수에 접근하기 위해 this.cnt를 사용했습니다.

슈퍼클래스에서 상속받아 재 구현한 서브클래스의 getInfo() 메서드는 이름이 같습니다.

서브클래스의 메서드를 실행하기 위해서는 현재 인스턴스화 된 객체의 메서드임을 표시하는 this.getInfo()로 구현하면 됩니다.

super도 마찬가지입니다.

슈퍼클래스의 생성자를 호출할 때는 super()를 사용하고,

슈퍼클래스의 변수에 접근하기 위해서 super.item으로 사용하면 되고,

슈퍼클래스와 서브클래스의 메서드명이 같지만 슈퍼클래스의 메서드에 접근하기 위해서는 super.getInfo()로 구현하면 됩니다. 물론 상속받은 서브클래스에서 말입니다.

지금까지 사실 별거 아닌 superthis의 사용법에 대해 알아봤습니다.

클래스를 설계하거나 플레인 자바 개발자 또는 서버 개발자라면 당연히 잘 알고 자주 접하게 되는 접근자입니다.

그런 재미있는 프로젝트는 어디에 있을까요? ㅋㅋ

즐 코딩하세요.

반응형
반응형

안녕하세요. 신기한연구소 티보이입니다.

자바에서 필수로 알아야 하는 조건문에 대해 알아봅니다.

자바에서 사용하는 조건문은 if-else문과 switch-case문 그리고 3항연산자가 있습니다.

? 세가지가 존재할까요?

어떤 것이 더 좋고 말고는 없습니다.

모두 좋은 조건문이고 가독성에 맞게 잘 사용하시면 됩니다.

그래도 보통은 switch-case문보다는 if-else문을 주로 사용합니다.

코드에서 가장 중요한 부분 중 하나는 가독성이거든요.

먼저 switch문에 대해 알아봅니다.

초기에 switch-case문은 조건식에 사용 가능한 데이터 타입은 [byte, short, char, int] 였습니다.

가장 많이 사용하는 변수형인 String가 지원되지 않아서 사실 일반 개발자들에게는 외면당하고 있었지요.

그런데 JDK 7부터는 String 도 대열에 합류하게 됩니다.

고정된 값인 상수를 사용하는 조건문인 경우 if-else도 가능하지만 틀에 맞아 보이는 switch-case문의 가독성이 더 좋아 보입니다.

자바에서 switch-case문은 어떻게 만들어서 사용하는지 살펴보겠습니다.

Switch(조건식) {

           Case 값1:

                      실행식;

                      Break;

           Case 값2:

                      실행식;

                      Break;

Case 값3:

                      실행식;

                      Break;

           …

           Default :

                      실행식;

}

Switch-case문 조건식의 값과 case문의 값이 일치하면 해당 실행문을 처리하고 break;문에 의해 빠져나오게 됩니다.

주의할 점은 break문을 깜박하고 넣지 않으면 일치하는 case문의 실행문을 처리한 뒤 그 뒤의 모든 case문과 default문도 같이 실행하기 때문에 잘 확인해야 합니다.

컴파일시나 런타임시 오류로 표기되지 않기 때문에 간혹 실수하는 경우가 있거든요.

특히 운영 데이터를 처리하는 과정에서 이런 실수로 인해 머리아픈 상황이 발생할 수 있기 때문입니다.

숫자형인 intchar, 그리고 문자열인 String으로 만든 switch-case문의 샘플을 만들어보겠습니다.

int형으로 만든 샘플입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Type int
    
switch(i) {
    case 10 :
        System.out.println("The value is 10");
        break;
    case 20 :
        System.out.println("The value is 20");
        break;
    case 30 :
        System.out.println("The value is 30");
        break;
    default :
        System.out.println("no value");
        
}
cs

char형으로 만든 샘플입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Type char
char c = 'B';
switch(c) {
    case 'A' :
        System.out.println("The value is A");
        break;
    case 'B' :
        System.out.println("The value is B");
        break;
    case 'C' :
        System.out.println("The value is C");
        break;
    default :
        System.out.println("no value");
 
}
cs

String형으로 만든 샘플입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
//Type String
String s = "GO";
switch(s) {
    case "COME" :
        System.out.println("The value is COME");
        break;
    case "GO" :
        System.out.println("The value is GO");
        break;
    case "SIT" :
        System.out.println("The value is SIT");
        break;
    default :
        System.out.println("no value");
 
}
cs

break가 없는 경우 샘플입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
//break가 없다면...
int j = 20;
switch(j) {
    case 10 :
        System.out.println("The value is 10");
    //    break;
    case 20 :
        System.out.println("The value is 20");
    //    break;
    case 30 :
        System.out.println("The value is 30");
    //    break;
    default :
        System.out.println("no value");        
}
cs

짧은 실행문을 가지고 있고 조건식이 상수라면 가독성이 더 좋아 보일겁니다. 

이제 if-else문에 대해 알아보는데 어떻게 구성되어 있는지 살펴보겠습니다.

If (조건식) {

           실행문

}else if (조건식) {

           실행문

}

Else{

           실행문

}

If-else문의 조건식은 Boolean값입니다. 조건식이 참인지 거짓인지로 판단해서 해당 실행문을 처리하는 건데요.

중요한 건 if로 시작해서 else if로 쭉 확인하다가 하나가 truebreak문이 없어도 해당 실행문만 처리하고 중단합니다.

실행문이 단문이면 굳이 { }를 사용하지 않아도 되고 2행 이상이면 반드시 { }로 묶어줘야 합니다.

조건이 하나면 if문만 사용하면 되고 else문도 필수는 아닙니다.

예문을 살펴볼께요.

1
2
3
4
5
6
7
8
9
boolean b = true;
String s1 = "T";
if(b) {
    System.out.println("boolean test true");
}else if ("T".equals(s1)) {
    System.out.println("String is T");
}else {
    System.out.println("bye");
}
cs

 

If문은 조건식의 Boolean값이기에 어떤 식도 만들어 사용할 수 있답니다.

Switch문과 if문의 속도는 어떤 것이 확실히 빠르다고 할 순 없어 보입니다.

테스트를 해보면 switch문이 빠른 경우가 더 많지만 if문이 더 빠른 경우도 있기에 절대적이지 않다는 의미입니다.

 

초반에 이야기 했듯이 프로그램은 가독성이 중요한 부분을 차지합니다.

필요없이 소스를 많이 만들거나 보기 어렵게 구성하는 것은 좋지 않는 코딩습관이거든요.

어떤 상황이냐에 따라서 switch-case, if-else, 3항연산자를 적절히 사용하면 되겠습니다.

사실 필자는 if-else문의 사용빈도가 거의 95%이상이라는 점

즐코딩 하세요~

반응형