자바에서 모든 클래스는 사실 Object를 암시적으로 상속받고 있는 것이다. 

그런 점에서 Object는 모든 클래스의 조상이라고 할 수 있다. 

그 이유는 모든 클래스가 공통으로 포함하고 있어야 하는 기능을 제공하기 위해서다.



toString

public String toString(){....}

toString 메서드는 인스턴스의 정보를 문자열의 형태로 반환하기 위한 메소드이다. 

가급적이면 toString 메소드를 오버라이딩 해서 인스턴스에 대한 정보를 적절히 표현할수 있도록 하는것이 좋다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Calculator{
    int left, right;
      
    public void setOprands(int left, int right){
        this.left = left;
        this.right = right;
    }
    public void sum(){
        System.out.println(this.left+this.right);
    }
      
    public void avg(){
        System.out.println((this.left+this.right)/2);
    }
     
    public String toString(){
        return "left : " + this.left + ", right : "+ this.right;
    }
}
  
public class CalculatorDemo {
      
    public static void main(String[] args) {
          
        Calculator c1 = new Calculator();
        c1.setOprands(1020);
        System.out.println(c1);
        System.out.println(c1.toString());
    }
  
}
cs





equals

== 연산자는 참조변수의 참조 값을 비교한다. 

따라서 인스턴스에 저장되어 있는 값 자체를 비교하려면 다른 방법을 사용한다.

일반적으로 인스턴스의 내용 비교를 위한 메소드 정의는 Object 클래스에 정의되어 있는 equals 메소드를 활용한다.


public boolean equals(Object obj)

이 메소드는 == 연산자와 마찬가지로 참조변수의 참조값을 비교하도록 정의되어 있다.

그런데 == 연산을 통해서 얼마든지 참조 값 비교가 가능하므로 

이 메소드는 내용비교를 하도록 오버라이딩을 해도 된다.(오버라이딩 목적으로 정의된 메소드)


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package java01;
 
class IntNumber
{
    int num;
    
    public IntNumber(int num){
        this.num = num;
    }
    
    public boolean equals(Object obj){
        if(this.num == ((IntNumber)obj).num)
            return true;
        else
            return false;
    }
}
 
class ObjectEquality{
    public static void main(String[] args){
        IntNumber num1 = new IntNumber(10);
        IntNumber num2 = new IntNumber(12);
        IntNumber num3 = new IntNumber(10);
        
        if(num1.equals(num2))
            System.out.println("num1 num2 일치");
        else
            System.out.println("num1 num2 불일치");
        
        if(num1.equals(num3))
            System.out.println("num1 num3 일치");
        else
            System.out.println("num1 num3 불일치");
    }
}
cs




표준 클래스의 equals 메소드가 내용비교를 하도록 이미 오버라이딩 되어있는 경우도 많다.

대표적으로 String 클래스가 있다.

'Java' 카테고리의 다른 글

자바 기본 클래스  (0) 2017.02.25
Object 클래스의 메서드 clone / finalize  (0) 2017.02.25
자바 메모리 모델  (0) 2017.02.25
예외클래스 정의 / throw / throws  (0) 2017.02.25
예외처리 try~catch /finally  (0) 2017.02.25


자바 가상머신은 운영체제로부터 할당받은 메모리 공간의 효율적인 사용을 위해 메모리 관리를 한다.

가상머신은 메모리 공간을 크게 세 개의 영역으로 나눈다.


메소드 영역

스택 영역

힙 영역


각각의 메모리 영역에는 다음의 데이터들을 저장한다.


메소드영역(method area) - 메소드의 바이트코드.static 변수

스택영역(stack area) - 지역변수,매개변수

힙 영역(heap area) - 인스턴스


메소드 영역

소스파일을 컴파일 할 때 생성되는 자바 가상머신에 의해 실행이 가능한 코드를 가르켜 '자바 바이트코드(bytecode)'라 한다.

이러한 바이트코드들도 메모리 공간에 저장되어 있어야 실행이 가능하다. 

따라서 실행의 흐름을 형성하는 메소드의 바이트코드들은 메소드 영역에 저장된다.

그리고 static 으로 선언되는 클래스 변수도 이 영역에 할당이 된다.

메소드 영역은 클래스 정보를 처음 메모리 공간에 올릴 때 초기화 되는 대상을 저장하기 위한 메모리 공간이다.


스택 영역

스택은 지역변수와 매개변수가 저장되는 공간이다. 이 둘은 다음의 공통적인 특징이 있다.

"메소드 내에서만 유효한 변수이다" 스택은 프로그램의 실행과정에서 임시로 할당되었다가 

메소드를 빠져나가면 바로 소멸되는 특성의 데이터 저장을 위한 영역이다.

지역변수와 매개변수는 선언되는 순간에 스택에 할당 되었다가, 

자신이 할당된 메소드의 실행이 완료되면 스택에서 소멸이 된다.


힙 영역

인스턴스는 힙 영역에 할당이 된다. 그 이유는 인스턴스의 소멸방법과 소멸 시점이 지역 변수와는 다르기 때문이다.

참조타입의 지역변수가 스택에 할당되면 힙영역의 인스턴스와 참조관계를 형성하게된다.

인스턴스의 소멸 시기는 자바 가상머신이 결정한다. 인스턴스가 어떠한 참조변수도 참조하지 않는 상태가 되면

자바 가상머신은 해당 인스턴스를 소멸시킨다. 이러한 소멸기능을 가비지 컬렉션 (Garbage Collection)이라 한다.




예외클래스 정의


프로그램의 논리에 어긋나지만 문법적으로 문제가 되지않는 상황은 가상머신이 인식할수있는 예외상황이아니다.

이러한 유형의 예외상황은 예외상황의 발생을 프로그래머가 정의해야 한다.


예외클래스 정의의 조건


Exception 클래스 상속

Exception 클래스는 모든 예외 클래스가 상속하는 Throwable 클래스의 하위 클래스이다.

이를 상속함으로 예외 클래스가 되어서 try~catch 예외처리 매커니즘에 활용이 가능한 클래스가 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
package java01;
 
import java.util.Scanner;
 
class AgeInputException extends Exception{
    public AgeInputException(){
        super("유효하지 않은 나이가 입력되었습니다.");
    }
}
class ProgrammerDefineException{
    public static void main(String[] args){
        System.out.println("나이를 입력하세요");
        try{
            int age = readAge();
            System.out.println("당신은"+age+"세입니다.");
        }catch(AgeInputException e){
            System.out.println(e.getMessage());
        }
    }
 
    public static int readAge() throws AgeInputException{
        Scanner sc = new Scanner(System.in);
        int age = sc.nextInt();
        if(age<0){
            AgeInputException excpt = new AgeInputException();
            throw excpt;
        }return age;
    }
}
 
 
/* 실행결과 
    나이를 입력하세요 : -2
    유효하지 않은 나이가 입력되었습니다.
*/
cs


실행결과를 통해 알수있는 사실

Exception 클래스의 생성자 호출을 통해서 전달된 문자열이 getMessage 의 호출을 통해서 반환된다.

예외클래스를 정의할 때 해당 예외의 상황설명에 필요한 문자열을 Exception 클래스의 생성자에 전달하면 된다.


throw 문의표현방식

예외상황이 발생했음을 알리는 문장 throw excpt;

throw 문이 존재하는 위치가 예외상황이 발생했음을 알리는 지점이 된다. 따라서 이 부분을 

try~catch 문으로 감싸서 예외상황을 처리 할수도 있는데 이러한 경우 예외의 처리는 throw 문이 존재하는 main 메소드의 

readAge 메소드 호출문장을 try~catch 문으로 감싸는 것이다.따라서 예외상황을 알리기 위해 생성된

AgeInputException 인스턴스의 참조 값은 main 메소드에 존재하는 catch 영역으로 전달되어 예외상황이 처리된다.


throws 문

예외상황이 메소드 내에서 처리되지 않으면 메소드를 호출한 영역으로 예외의 처리가 넘어감(던져짐)을 반드시 명시해야 한다.

throw에 의해 생성된 예외상황은 반드시 try~catch 문에 의해 처리되거나 throws 에 의해서 넘겨져야 한다.


readAge 메소드의 정의를 보면 throws AgeInputException 선언이 존재한다.

이는 "readAge 메소드 내에서 AgeInputExcpetion 에 대한 예외상황을 처리하지 않으니 이 메소드를 호출하는 영역에서는

AgeInputException 에 대한 처리도 대비해야 한다."는 선언이다.

이렇듯 throw에 의해 생성된 예외상황이 메소드 내에서 처리되지 않는다면 메소드를 호출한 영역으로 넘어감을 반드시 명시해야 한다.


가상머신의 예외처리

throws 문에 의해 던져진 예외상황은 메서드를 호출하는곳으로 넘겨진다. 예외상황이 main메소드를 호출한 영역까지 넘어가게 되면

main메소드는 자바 가상머신이 호출하는 메소드이기 때문에 예외처리는 가상머신이 하게된다.

가상머신의 처리방식은 1.getMessage 메서드 호출 2.예외상황 발생해서 전달되는 과정 출력 3.프로그램종료

더이상의 실행으로 이어지지 않고 프로그램이 종료된다.


printStackTrace

예외가 발생해서 전달되는 과정의 출력은 프로그램에 존재하는 오류를 파악하는데 매우 도움이 된다.

이러한 유형의 메세지를 출력하는방법은 Throwable 클래스에 정의되어있는 

printStackTrace 메소드가 이러한 유형의 메세지를 출력한다.


1
2
3
4
5
try{
    ...        
}catch(Exception e){
    e.printStackTrace();
}
cs




'Java' 카테고리의 다른 글

Object 클래스의 메서드 toString / equals  (0) 2017.02.25
자바 메모리 모델  (0) 2017.02.25
예외처리 try~catch /finally  (0) 2017.02.25
인터페이스 interface  (0) 2017.02.25
abstract 클래스 (추상 클래스)  (0) 2017.02.25

try~catch

자바는 예외처리를 위해서 try~catch 문을 제공하고 있다. try와 catch는 하나의 문장을 구성하지만

각각의 중괄호를 이용한 별도의 영역을 형성하게 된다.

try 는 예외상황이 발생할 만한 영역을 감싸는 용도로 사용이 되고 

catch는 발생한 예외의 처리를 위한 코드를 묶어두기 위한 용도로 사용이 된다.

catch 영역에서 예외상황이 처리되기 때문에 소스코드상에서 예외상황의 처리를 위한 코드를 아주 쉽게 구분할수 있다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import java.util.Scanner;
 
public class DivideByZero {
    public static void main(String[] args){
        System.out.print("두개의 정수 입력");
        Scanner sc= new Scanner(System.in);
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();
        
        try{
            System.out.println("나눗셈 결과의 몫 : "+(num1/num2));
            System.out.println("나눗셈 결과의 나머지 : "+(num1%num2));
        }catch(ArithmeticException e){
            System.out.println("나눗셈 불가능");
            System.out.println(e.getMessage());
        }
        System.out.println("프로그램 종료");
    }
}
cs


자바 가상머신이 예외상황이 발생한것을 인식하면 이상황을 위해 정의된 ArithmeticException 클래스의 인스턴스를 생성하고

생성된 인스턴스의 참조 값을 catch 영역에 선언된 매개변수에 전달한다.


예외클래스

ArithmeticException 과 같이 예외상황을 알리기 위해 정의된 클래스들을 가리켜 '예외 클래스' 라 한다.

e.getMessage() 메서드는 예외상황을 알리기 위해 정의된 모든 예외 클래스들이 상속하는 

Throwable 클래스에 정의된 메소드이다. 모든 예외 클래스는 Throwable 클래스를 상속한다.


finally

예외상황의 발생여부와 상관없이 항상 실행되는 영역

finally 영역은 try~catch 문의 마지막에 삽입되어 예외상황의 발생 여부와 상관없이 실행된다.

try 영역에 들어가면 무조건 실행된다 실행의 흐름 중간에 return을 하더라도 finally영역은 실행되고 나서 빠져나가게 된다.


1
2
3
4
5
6
7
8
9
10
11
12
13
14
public class FinallyTest {
    public static void main(String[] args){
        
        
        try{
            
        }catch(Throwable e){
            
        }finally{
            System.out.println("예외상황 발생과 상관없이 실행되는 영역");
        }
        
    }
}
cs






 

'Java' 카테고리의 다른 글

자바 메모리 모델  (0) 2017.02.25
예외클래스 정의 / throw / throws  (0) 2017.02.25
인터페이스 interface  (0) 2017.02.25
abstract 클래스 (추상 클래스)  (0) 2017.02.25
final 클래스/final 메소드  (0) 2017.02.25

인터페이스는 상속과 메소드 오버라이딩을 기반으로 메소드에 대한 약속을 프로그램 코드상에서 규정하는 것이다.

객체가 인터페이스를 구현하면 그 객체는 인터페이스의 메소드를 반드시 구현해야 한다.


일반적으로 클래스가 인터페이스를 상속하는 경우에는 상속 이라는 표현을 쓰지않고 구현 이라는 표현을 쓴다.

하위클래스에서 인터페이스에 정의된 텅 빈 메소드(abstract 메소드) 를 구현해서 채워 넣어야 하기 때문이다.

그래서 인터페이스를 구현 할 때에는 키워드 extends를 사용하지 않고 키워드 implements 를 사용한다.

그리고 인터페이스 내에 정의되는 메소드는 무조건 public abstract 로 선언되기 

때문에 이에대한 선언을 별도로 해줄 필요가 없지만 많은 개발자들이 명확히 표현하는 경우가 많다.


인터페이스의 규칙

인터페이스 내에 존재하는 변수는 무조건 public static final 로 선언된다.

인터페이스 내에 존재하는 메소드는 무조건 public abstract 로 선언된다.

인터페이스는 참조변수의 선언이 가능하고 메소드의 오버라이딩도 가능하다.

인터페이스도 오버라이딩과 마찬가지로 하위클래스에서 

접근제어 지시자의 허용범위를 좁히는 방식으로는 접근제어 지시자를 변경할수 없다.

인터페이스 간에도 상속 관계를 형성할수 있다. 상속을 표현하는데에 있어서는 implements가 아닌 extends가 사용된다.


1
2
3
4
5
6
7
public interface MyInterface{ //인터페이스는 public 으로 선언하는것이 일반적이다.
    public void myMethod(); //public이 아니더라도 public 으로 선언된다.
}
 
public interface YourInterface{
    public void yourMethod();
}
cs


위와같이 두개의 인터페이스가 정의되어 있을때 클래스는 위의 두 메소드를 동시에 구현 할수 있다.


1
2
3
4
Class OurClass implements Myinterface, YourInterface{
    public void myMethod(){...}
    public void yourMethod(){...}
}
cs




abstract interface 차이

인터페이스와 추상 클래스는 서로 비슷한 듯 다른 기능이다.

인터페이스는 클래스가 아닌 인터페이스라는 고유한 형태를 가지고 있는 반면추상 클래스는 일반적인 클래스다. 

또 인터페이스는 구체적인 로직이나 상태를 가지고 있을 수 없고추상 클래스는 구체적인 로직이나 상태를 가지고 있을 수 있다.



'Java' 카테고리의 다른 글

예외클래스 정의 / throw / throws  (0) 2017.02.25
예외처리 try~catch /finally  (0) 2017.02.25
abstract 클래스 (추상 클래스)  (0) 2017.02.25
final 클래스/final 메소드  (0) 2017.02.25
instance of 연산자  (0) 2017.02.25
1
2
3
4
5
6
7
8
9
10
abstract class Friend
{
    ...
    public void showData()
    {
        ...
    }
    
    public abstract class void showBasicInfo();
}
cs



abstract 클래스는 완전하지 않은 클래스를 의미한다. 따라서 인스턴스의 생성이 불가능한 클래스이다.


메서드의 몸체 부분이 존재하지 않는 메서드를 abstract 메서드 (추상 메서드)라고 한다.

abstract 메서드는 클래스를 상속하는 하위 클래스의 메서드와 오버라이딩의 관계를 형성하기 위해 정의된 메서드이다.

abstract 메서드가 정의되어 있는 클래스는 인스턴스의 생성이 불가능하기 때문에

클래스 역시 abstract 키워드가 선언되어야 한다.


abstract 메소드가 없어도 인스턴스의 생성을 원하지 않으면 클래스를 abstract 로 선언할수 있다.

그러나 abstract 메서드가 하나라도 있으면 그 클래스는 반드시 abstract 로 선언해야 한다.


abstract 클래스를 상속받는 하위 클래스는 abstract 메서드를 반드시 오버라이딩 해야 컴파일이 가능하다.​

'Java' 카테고리의 다른 글

예외처리 try~catch /finally  (0) 2017.02.25
인터페이스 interface  (0) 2017.02.25
final 클래스/final 메소드  (0) 2017.02.25
instance of 연산자  (0) 2017.02.25
다형성  (0) 2017.02.25

final 키워드를 변수의 앞에다 선언하면 값의 변경이 불가능한 상수가된다.


1
final int num
cs




클래스의 정의에 final 선언을하면 "이 클래스를 상속하는 것을 허용하지 않겠다." 는 의미이다.


1
2
3
4
final class MyClass
{
    ...
}
cs





메소드가 final 로 선언되면 "이 메소드의 오버라이딩을 허용하지 않겠다." 라는 의미이다.

클래스는 상속이 가능하되 final 선언이된 메서드는 오버라이딩이 불가능하다.


1
2
3
4
5
6
7
class YourClass
{
    final void yourFunc(int n)
    {
        ...
    }
}
cs


'Java' 카테고리의 다른 글

인터페이스 interface  (0) 2017.02.25
abstract 클래스 (추상 클래스)  (0) 2017.02.25
instance of 연산자  (0) 2017.02.25
다형성  (0) 2017.02.25
오버라이딩  (0) 2017.02.25

instance of 연산자 연산자는 상속관계를 바탕으로 형변환이 가능한지를 묻는 연산자이다.

그결과로 true 또는 false 를 반환하는 연산자이다.


1
2
3
4
5
6
7
8
9
10
11
 //instanceof 연산자
 
//객체 instanceof 클래스이름 : 객체가(객체변수, 참조변수) 뒤의 클래스형으로 참조가 가능하면 true 불가능하면 false
 
Car c = new Car();
Ray r= new Ray();
if( c instanceof Ray){....} // if조건 false
if( r instanceof Car){....} // if조건 true
 instanceof 연산자
 
[출처] [27] OOP - 다형성(polymorphism) (JAVA, JAVASCRIPT 개발자 (자바, 자바스크립트)) |작성자 zeroDay
cs


'Java' 카테고리의 다른 글

abstract 클래스 (추상 클래스)  (0) 2017.02.25
final 클래스/final 메소드  (0) 2017.02.25
다형성  (0) 2017.02.25
오버라이딩  (0) 2017.02.25
상속  (0) 2017.02.25

+ Recent posts