본문 바로가기

Language/Java

(25)
다형성 (Polymorphism) 클래스의 인스턴스를 변수로 선언할 때, 해당 클래스의 데이터 타입으로 선언하지 않고, 부모 클래스나 인터페이스를 데이터 타입으로 선언할 수도 있다. 이렇게 객체의 타입이 부모 클래스, 인터페이스, 자식 클래스 등 여러 형태인데도 인스턴스로 만든 객체(자식 클래스의 인스턴스)와 같이 행동하는 것을 다형성(polymorphism)이라고 한다. 하나의 클래스가 여러 가지의 얼굴을 가지게 하는 것이 다형성이다. interface Calculable { double PI = 3.14; int sum(int v1, int v2); } interface Printable { void print(); } class RealCal implements Calculable, Printable { public int sum(..
인터페이스 (Interface) 인터페이스(Interface)를 이용하면 앞으로 만들 클래스의 규격을 선언할 수 있다. interface Calculable { int sum(int v1, int v2); } class RealCal implements Calculable { // 오류 발생 } public class InterfaceApp { public static void main(String[] args) { RealCal c = new RealCal(); System.out.println(c.sum(2, 1)); } } 위 코드를 보면, Calculable 인터페이스를 implements 하는 RealCal 클래스가, Calculable 인터페이스가 규제하고 있는 형태를 정확하게 엄수하고 있지 않기 때문에 컴파일조차 안 된다...
상속과 생성자 자식 클래스는 부모 클래스의 모든 것들을 상속 받는다. 생성자(Constructor)도 마찬가지이다. 부모 클래스에 생성자가 있는 경우에, 자식 클래스에 이미 해당하는 생성자가 만들어져 있다면 그것을 호출한다. 그렇지 않다면 암묵적으로 부모 클래스의 생성자(super())를 호출하게 된다. 하지만 상속관계에 있는 클래스의 생성자에 기본 생성자(인자가 전혀 없는 생성자)가 아닌 인자가 포함된 생성자를 사용하는 경우 주의해야 한다. class Calculator { int v1, v2; Calculator(int v1, int v2) { System.out.println("Calculator init!"); this.v1 = v1; this.v2 = v2; } } // Compile Error class C..
this, super this는 인스턴스를 가리키는 키워드이다. 이와 비슷하게 부모 클래스를 가리키는 super라는 키워드도 존재한다. 자식 클래스에서 super을 이용하여 접근 권한이 부여된 부모 클래스의 변수와 메소드에 접근할 수 있다. class Calculator { public int sum(int v1, int v2) { return v1 + v2; } // Overloading public int sum(int v1, int v2, int v3) { return this.sum(v1, v2) + v3;// this 키워드 사용하여 계승, 발전 } } class Calculator2 extends Calculator { public int minus(int v1, int v2) { return v1 - v2; } ..
Overriding, Overloading 자바로 프로그래밍을 하다보면 Overriding과 Overloading이라는 키워드를 마주치게 된다. Override 우선 Override란 자식 클래스에서 부모 클래스가 가진 기능에 무언가를 보태어 같은 이름으로 재정의할 때 사용하는 기능이다. 상속(inheritance)에서 사용되는 개념이다. 상속은 일반적으로 좀 더 추상적인 부모 클래스(superclass)와, 그 부모 클래스를 답습한 더 구체적인 자식 클래스(subclass)로 구분된다. 부모 클래스가 가지고 있는 기능을 마냥 답습하기만 하는 자식 클래스라면 굳이 만들 필요가 없다. 이때 부모 클래스가 가진 기능이지만 더 보태서 같은 이름으로 다시 재정의하는 것을 Override라고 하는 것이다. class Calculator { public i..
생성자(constructor)와 this 클래스는 인스턴스를 생성할 때 클래스의 이름과 같은 이름인 생성자(constructor)로 인스턴스를 만든다. 클래스는 따로 만들어 주지 않아도 기본 생성자를 포함하고 있다. 아무것도 지정하지 않는 생성자를 기본 생성자라고 한다. 기본적으로 public 권한으로 설정되어 있어서 따로 명시하지 않아도 클래스를 만들게 되면 새로운 인스턴스를 생성할 수 있도록 만든다. 만약 처음에 인스턴스를 생성할 때부터 필드를 초기화하고 싶다면, 필드를 초기화할 수 있게 만드는 생성자를 구성할 수 있다. 생성자는 접근 권한을 설정할 수 있고, 리턴 타입은 명시하지 않으며, 초기화할 필드에 따라 파라미터를 설정한다. import java.io.FileWriter; import java.io.IOException; public..
static 자바를 공부하다보면 자주 보이는 것이 있다. 바로 static이다. public class Practice { public static void main(String[] args) { System.out.println("a"); } } 거두절미하고, static이란 static - class method no static - instance method 이다. 즉, 메소드를 정의할 때 static이라는 키워드를 쓰면 그 메소드는 클래스 소속이고, static이라는 키워드를 쓰지 않으면 그 메소드는 인스턴스의 소속이라는 것이다. static 메소드는 클래스의 메소드로, 프로그램에서 한 번만 정의된다. 여러 개 가질 수 없는 유일무이한 메소드이다. 반면 static이 아닌 메소드는 인스턴스의 메소드로, 프로..
접근 제어자 (access level modifiers) 자바로 프로그램을 만들다 보면 public이라는 것을 계속 사용한다. public 은 자바의 접근 제어자(access level modifiers)이다. class Greeting { // public, protected, default, private public static void hi() { System.out.println("Hi"); } } public class AccessLevelModifiersMethod { public static void main(String[] args) { Greeting.hi(); } } 위와 같은 코드가 있을 때, Greeting 클래스 안에 public 메소드 hi를 main 메소드에서 성공적으로 불러올 수 있다. 왜냐하면, hi는 Greeting 클래스 밖..