## 상속이란 무엇인가? 

상속은 Parent 와 Child로 설명을 많이 하고는 하는데 정작 사용하는 방법에만 집중하여 본질을 놓치고는 한다(이건 내얘기임;;) 

상속을 사용하는 가장 큰 목적은 우리가 편하기 위함이다(잉? 뭔소리 뭔들 불편하고자 쓰겠냐...)

위에서 말한 편함은 정확히는 "코드의 중복"을 줄이기 위하여 사용한다. 

 

## 자바 상속의 특징 

자바 상속의 특징을 알기 위해서는 먼저, 상속을 어떻게 하는지 부터 시작해야겠다. 우선 Child 클래스인 Student 는 Person 클래스를 "extends" 해야 상속받을 수 있다. 자식 부분과 부모 부분은 각각의 생성자가 담당하여 책임지는데 이때,

1) extends 는 Person 하나 밖에 받을 수 없다. 

2) private 으로 정의된 멤버변수는 Child에서 상속받으나(개체에서 확인할 수 있으나) 메소드는 불가능하다. 

3) 모든 클래스의 Parent Class 는 Object 클래스이다. 

4) super 키워드에서도 알 수 있듯이 생성자는 상속받지 않는다.

 

public class Person {
    public String name;
    public int age;
    private String onlyForBase;

    Person(String name, int age){
        this.name = name;
        this.age = age;
        System.out.println("Person Constructor is called");
    }

    public String sayMyName(){
        return this.name;
    }

    public int getAged(){
        return this.age + 1;
    }

    private String onlyForMe(){
        return this.onlyForBase;
    }

}

public class Student extends Person{

    Student(String name, int age){
        super(name, age);
        System.out.println("Student Constructor is called");
    }
}

## super 키워드

위의 코드에서 보았다싶이, super 키워드는 Parent 를 의미한다. 

super()로 하면 부모인 Person 의 생성자를 호출하고, 부모의 멤버변수 및 메소드에 접근하기 위해서는 super.name, super.sayMyName()으로 접근하면 된다. 

 

## 메소드 오버라이딩

위의 코드에서 부모의 sayMyName()을 오버라이드(재정의)하여 사용할 수 있다. 

    @Override
    public String sayMyName() {
        return "I am not you";
    }

## 추상 클래스

추상 클래스는 추상적인 클래스, 즉 개체를 생성할 수 없는 클래스를 의미한다. 위에서 상속을 활용한 예시인 Person 과 Student 는 모두 각각 Person 과 Student 의 개체를 만들 수 있었다. 그러나 abstract 키워드를 통해 작성한 추상 클래스인 경우에는 개체를 생성할 수 없다. 

다만 해당 추상 클래스를 상속받은 클래스에서는 추상 클래스를 사용할 수 있고 추상 메소드가 있는 경우에는 오버라이드해야 한다.

 

## final 키워드 

final은 사전적의미로 마지막이란 의미이다. 즉, 변수에 final 키워드를 지정한다면 상수가 되는 것이고, 메소드에 쓰인다면 메소드의 오버라이드가 불가능한 것이고 클래스에 쓰인다면 상속이 불가능한 것이다! 

 

## Object 클래스

Object 클래스는 모든 클래스가 상속받는 대상이다. 

새롭게 클래스를 만들고 아무 메소드도 정의하지 않아도, 기본적으로 보이는 몇개의 메소드들이 바로 Object 클래스에서 상속받기 때문에 확인할 수 있는 메소드(equals.. 등) 이다. 

 

메소드의 종류 및 내용에 대해서는 docs.oracle.com/javase/8/docs/api/java/lang/Object.html 서 보면 될 것 이고 

특이한 점으로는 protected 메소드인 clone(), finalize() 메소드들은 분명히 상속을 받음에도 불구하고 사용이 불가능하였다. 

 

## 다이나믹 메소드 디스패치 

인터페이스 레퍼런스를 활용하는 방식과 유사하게 느껴지고 사용하는 목적은 다형성의 확보이다.

인터페이스 와 상속에서의 사용의 차이는 무엇일지가 궁금하다. 

 

Person d1 = new Teacher("", 40); // or could be new Student("", 41);

d1.sayMyName(); // Person 에 있는 sayMyName()이지만, Runtime 도중 구현체가 결정됨.

 

'가치코딩 [Java] > 기초문법' 카테고리의 다른 글

[Java 문법] 인터페이스  (0) 2021.03.05
[Java 문법] I/O  (0) 2021.03.04
[Java 문법] 어노테이션  (0) 2021.02.06
[Java 문법] enum  (0) 2021.02.04
[Java 문법] 패키지  (1) 2021.02.03

## 인터페이스의 개념

인터페이스는 사전적으로 inter(=between) + face(면) 을 의미한다. 즉 사이에 있는 면인 접점이다. 가령, 우리가 TV를 사용한다고하면, 전원버튼, 채널버튼, 그리고 음량버튼만 알면 TV를 사용하는 데에 아무 지장이 없는 것처럼 굳이 전원버튼을 누르면, 내부에서 어떤 스위치의 상태가 변동하여 전류가 흘러 LCD가 어떻게 동작하는 지 사용자인 우리는 알 필요가 없다. 

 

## 인터페이스를 정의하는 방법 

인터페이스 정의는 간단하다. public + interface 키워드조합으로 간단히 정의할 수 있으며, 

내부에는 구현이 없는 메소드(시그니처)만 정의하면 끝난다. 이때, private 으로 public 을 바꿔보면 now allowed here 이라고 나오는데, 이는 당연히 이를 활용해여 구현을 해야하는데 접근제어자가 private 이면 말이 안되는 것(...)

public interface CookHelper {
    void boil(Dish food);
    void bake(Dish food);
    void fry(Dish food);
}

## 인터페이스를 구현하는 방법 

구현 역시 간단하다. 사용하고자 하는 인터페이스를 implements 하면 된다. 

이때, 정의해놓은 메소드 시그니처를 구현하지 않으면 컴파일 에러가 발생한다. 

public class NewChef implements CookHelper {

    @Override
    public void boil(Dish food) {
        // Do Something by new Chef!
    }

    @Override
    public void bake(Dish food) {
        // Do Something by new Chef!
    }

    @Override
    public void fry(Dish food) {
        // Do Something by new Chef!
    }
}

 

## 인터페이스 레퍼런스를 통해 구현체를 사용하는 방법 

인터페이스 참조변수에 구현체를 할당하여, 다형성을 확보할 수 있다. 

    public static void main(String[] args) {
        CookHelper cook = new OldChef();
        Dish dish = new Dish();
        cook.bake(dish);
        
        cook = new NewChef();
        cook.bake(dish);
    }

## 인터페이스의 상속 

인터페이스는 다중 상속받을 수 있는며, 인터페이스끼리도 상속받을 수 있다. 

public interface DeliveryHelper extends ServiceHelper {
    void makeBill();
}

public class OldChef implements CookHelper, DeliveryHelper {

    @Override
    public void boil(Dish food) {
        // Do Something by new Chef!
        System.out.println("Old Cook boils");
    }

    @Override
    public void bake(Dish food) {
        // Do Something by new Chef!
        System.out.println("Old Cook bakes");
    }

    @Override
    public void fry(Dish food) {
        // Do Something by new Chef!
        System.out.println("Old Cook fries");
    }

    @Override
    public void makeBill() {
        System.out.println("Old Cook gets bill to customer");
    }

    @Override
    public void serve(Dish dish) {
        // Serve
    }
}

--------------------------------------------------------------------------------------------------------

 

## 인터페이스의 기본 메소드 (Default Method), 자바 8

## 인터페이스의 static 메소드, 자바 8

## 인터페이스의 private 메소드, 자바 9

-> 위의 3개 주제는 기존 인터페이스 개념을 흔들어놓기 때문에, 어떤 불편한점에 의해서 private, static 등이 생겨났는지는 충분한 시간이 필요할 것 같아서 추후 충분한 자료를 검토 후 업데이트 예정.  

 

 

 

'가치코딩 [Java] > 기초문법' 카테고리의 다른 글

[Java 문법] 상속  (0) 2021.03.06
[Java 문법] I/O  (0) 2021.03.04
[Java 문법] 어노테이션  (0) 2021.02.06
[Java 문법] enum  (0) 2021.02.04
[Java 문법] 패키지  (1) 2021.02.03

## I/O 의 의미
 I/O는 입력과 출력을 뜻한다. 입력과 출력은 무엇일까?
 프로그램을 기준으로, 컴퓨터 주변장치(키보드, 마우스 등)를 통해 데이터를 수신하는 것을 입력이라하고, 프로그램이 다른 프로그램 혹은 장치로 데이터를 송신하는 것을 출력이라고 한다.

 

## 스트림, 버퍼, 채널의 차이는? 
 자바에서 흔히 IO에는 두 분류가 있다. 바로 IO와 NIO이다. IO는 Input, Output 을 의미하고, NIO는 New Input Output을 의미한다.
 새로운 IO라.. 무슨 차이가 있는걸까? IO는 blocking인 반면에 NIO는 non-blocking이란 점에 차이가 있다.
 실생활에 비유하여 내가 공부를 하는 경우에 blocking인 경우에는 수학공부를 하는 동안에는 열심히 수학공부만 계속 하는 것이고, non-blocking인 경우 수학→영어→국어 돌아가면서 공부하는 것이다. 다만 여기서 sync, async의 개념을 더 적용하자면, sync는 영화를 틀어서 보는 것이고, async는 친구에게 카톡(일방적)을 보내는 것으로 생각하면 될 것 같다. 자 어쩃든 구분은 스트림 <> 버퍼, 채널 로 크게 분류될 수 있다.

## 바이트 스트림과 캐릭터 스트림
- 바이트 스트림: 1byte 씩 읽어서 처리 InputStream, OutputStream 을 상속받은 클래스는 모두 byte stream 이다.  
- 캐릭터 스트림: 2byte 씩 읽어서 처리, 영어가 아닌 다른 언어를 처리하기 위해 필요 Reader, Writer 를 상속받은 클래스는 모두 character stream 이다. 


## Sytem 밑의 out / in / err 은? 
out / err -> outputStream (송신)

in -> inputStream (수신)

다만 여기서 특이한 점으로는, err인데 얼핏보면 out 과 차이가 없어보이지만, 사용 용례는 에러나 사용자의 즉각적인 집중이 필요할 때 사용된다는 점이다. 

 

## 파일 읽기 

FileInputStream in = null; // for reading
FileOutputStream out = null; // for writing

try {
  in = new FileInputStream("/Users/{username}/study/PracticeJava/src/inputoutput/xanadu.txt");
  out = new FileOutputStream("outagain.txt");
  int c;
  System.err.println();

  while ((c = in.read()) != -1) {
    out.write(c);
  }
} 
finally {
  if (in != null) {
	in.close();
  }
  if (out != null) {
	out.close();
  }
}

 

'가치코딩 [Java] > 기초문법' 카테고리의 다른 글

[Java 문법] 상속  (0) 2021.03.06
[Java 문법] 인터페이스  (0) 2021.03.05
[Java 문법] 어노테이션  (0) 2021.02.06
[Java 문법] enum  (0) 2021.02.04
[Java 문법] 패키지  (1) 2021.02.03

오늘도 enum을 제대로 알고자 오라클 튜토리얼 열심히 한번 읽어봅니다. 

 

Annotation(어노테이션) 은 무엇인가요?

Annotations, a form of metadata, provide data about a program that is not part of the program itself. Annotations have no  direct effect on the operation of the code they annotate.

"Annotation은 프로그램의 일부가 아닌, 프로그램에 대한 정보를 제공하는 일종의 메타데이터이다. 어노테이션된 코드의 동작에는 직접적인 영향을 끼치지 않는다

 

Annotation(어노테이션) 은 왜 쓰나요?

1) 컴파일러에게 정보(에러 감지 혹은 컴파일러 경고에 대해 무시 등..)를 주기 위해 

 -> @SuppressWarnings 등

2) 컴파일 및 배포 시 코드, XML 파일 등을 생성하기 위해

 -> @Getter, @Setter 등

3) 런타임 시 검사를 수행하기 위해 

 -> ????? 코드의 동작에는 직접적인 영향을 끼치는 것이 아닌가 싶다... 

2번과 3번은 어노테이션 프로세서와 관련이 있어보이는데 스터디 후 다시 정리할 예정.

 

 

Annotation(어노테이션) 은 어떻게 정의하는지 

어노테이션은 특별한 인터페이스라하여 @ + interface로 정의한다. 

public @interface DeepDiveToAnnotation {

    // Element 정의
    String title();
    String description();

}

 

Annotation(어노테이션) 의 종류에는 무엇이 있는지 

내용이 100% 정리가 되지 않아서 일단 기본적인 부분만 정리하고 간다. 

@Target(ElementType.TYPE)
@Retention(RetentionPolicy.SOURCE)
@Documented // javadoc 생성을 위한 Annotation
public @interface DeepDiveToAnnotation {

    // Element 정의
    /** This is title! Using this when....  */
    String title();
    /** This is description! Using this when....  */
    String description();

}

 

@Target 어노테이션의 적용 대상을 지정하며 TYPE, FIELD, METHOD, PARAMETER 를 포함하여 다양하게 존재함.
java.lang.annotation 패키지의 ElementType enum에 정의되어 있음
@Retention 어노테이션의 정보가 어느시점까지 유지되는지 의미한다. 
종류로는 SOURCE, CLASS, RUNTIME 이 존재한다.  
@Documented javadoc 생성을 위해 사용되는 어노테이션

 

 

 

Annotation(어노테이션) Processor

추후 정리예정...

'가치코딩 [Java] > 기초문법' 카테고리의 다른 글

[Java 문법] 인터페이스  (0) 2021.03.05
[Java 문법] I/O  (0) 2021.03.04
[Java 문법] enum  (0) 2021.02.04
[Java 문법] 패키지  (1) 2021.02.03
[Java 문법] 예외처리  (0) 2021.01.21

오늘도 enum을 제대로 알고자 오라클 공식문서를 열심히 한번 읽어봅니다. 

 

# enum 개념 

- 왜 쓰는지?

enum은 열거 및 목록을 의미하는데, 자바에서는 미리 목록을 정의하고자 사용한다.

이때, 목록은 런타임에서 변하지 않는 상수를 의미한다. 특이한 점은 별도로 타입을 지정할 필요가 없다는 점이 없다는 점이다. 

 

- 어떤 의미가 있어?

c언어에서 enum을 특정한 값 없이 지정한 경우 0부터 할당되는데, 이때 switch문을 통해 활용하는 경우 실제 값인 0,1,2 등을 가지고 동작하기 때문이다. 그러나 자바에서의 enum은 기존에 C언어에서의 enum의 사용에서 업그레이드 되었다. 우선 Type 체크를 수행한다.

public enum Food {
    KOREAN(10),
    AMERICAN(20),
    CHINESE(30),
    MEXICO(40);

    private final int value;

    Food(int value){
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

public static void main(String[] args) {

        Food food = Food.AMERICAN;

        // Type check... We cannot use Drink enum or int in here :D
        switch (food){
            case KOREAN:
                System.out.println("Welcome to Korea!");
                break;
            case MEXICO:
                System.out.println("Welcome to Mexico");
                break;
            case CHINESE:
                System.out.println("Welcome to China");
                break;
            case AMERICAN:
                System.out.println("Welcome to US");
                break;
        }
    }

switch 문의 case 에서 다른 타입의 동일한 값을 지닌 enum은 사용할 수 없다. 

 

 

# enum에서 알고 있어야하는 내용 

- 생성자 

enum 클래스는 Enum을 상속받지 않아도 컴파일러가 컴파일 시 Enum 클래스를 상속받는다.

가령 위에서는 Enum(KOREAN, 0) 이 된다 재미있는 점은 초기에 클래스로더가 자바 프로그램을 구동할 때 여러가지 enum 클래스들을 초기화하는 모습도 같이 볼 수 있었다. 

 

- 메소드

따로 중요하게 봐야할 메소드는 values라 생각되는데, 그 이유는 iterate 할 때 유용하기 때문이다. 

그러나 중요한 포인트로는 ordinal 메소드가 ordinal 순서값을 반환하는 역할을 하는데 실제 해당 메소드에 의존하여 코드를 작성하면 안된다는 것이다. 왜냐하면 ordinal 값은 enum 클래스의 멤버가 추가될 때 마다 그 값의 ordinal이 변동될 수 있기 때문이다.

 

'가치코딩 [Java] > 기초문법' 카테고리의 다른 글

[Java 문법] I/O  (0) 2021.03.04
[Java 문법] 어노테이션  (0) 2021.02.06
[Java 문법] 패키지  (1) 2021.02.03
[Java 문법] 예외처리  (0) 2021.01.21
[Java 문법] 클래스  (0) 2020.12.18

패키지란 무엇인가

오라클 문서에서는 패키지에 대해 access protection 과 namespace 관리를 제공하는 것으로 설명하고 있다. 

namespace를 사용함으로써 얻을 수 있는 이점은 여러 사람이 협업 시 클래스의 이름이 중복되더라도, 이를 구분할 수 있기에 사용이 가능하다.

 

가령 동일한 패키지 내에서는 같은 이름의 클래스를 만들수가 없는데,  패키지를 사용함으로써 같은  클래스명이 사용될 수 있다. 물론 사용 시에는 이에 대한 구분을 하기 위해 패키지를 import 해주거나, FQN(Fully Qualified Name)을 사용해야 한다. 

 

 

import란 무엇인가?

# import

위에서 말한 import 를 사용하지 않고 Fully Qualified Name을 사용하면 보다시피 인스턴스 생성시 아래와 같이 비효율성이 증가한다. 

 

import packages.differentpackage.nested.*;

public class main {

    public static void main(String[] args) {
        // Using FQN(Fully Qualified Name) on packages.differentpackage.nested
        packages.differentpackage.nested.TestClass FQN = new packages.differentpackage.nested.TestClass();
        // Using "import" on packages.differentpackage.nested
        TestClass IMPORT = new TestClass();
        // For explaining import .* 
        packages.differentpackage.TestClass AnotherClass = new packages.differentpackage.TestClass();
    }
}

이를 해결하고자 import를 사용하는데, 이때 패키지의 멤버 또는 패키지 전체를 import 할 수 있다. 다만 주의할 점으로는, import 는 해당 패키지내의 멤버들만을 의미한다. 

예시에서의 import packages.differentpackage.nested.*  는 packages.differentpackage 내의 TestClasss는 import 하지 않기 때문에 주의를 해야한다. 

 

# static import

오라클에서 Math 관련 내용을 사례로 제시하니 이를 활용하여 설명하면 사용하는 목적 자체는 static한 메소드나 변수를 사용하기 위함이다. 

 // Test w/ and wo/import static
int radius = 1;

// Case 1 : without import static
// Math math = new Math();   // Error : Math's constructor is private

// So we need to add "import static"
double RoundLengthOfCircle = PI * radius;

클래스패스?

클래스패스는 클래스를 찾기위한 경로(PATH)를 의미한다. 

IDE가 정말 고맙다..ㅠㅠㅠ

"."은 현재 경로를 의미하고, ":"을 통해서 필요한 클래스 경로를 추가하면 된다. 

그러나 이것은 굉장히 뻘짓이기 때문에, IDE를 사용하면, java 컴파일 및 실행에 필요한 경로를 추가해준다. 

 

접근지시자?

앞에서 클래스에서도 다루었지만, 접근제어자는 public, protected, default, private 가 존재하며 변수, 메소드, 클래스에 사용하여 접근을 제한하는 데에 그 목적이 있다. 

 

public 은 누구나 접근이 가능

protected 는 동일패키지 혹은 상속받았을 경우 접근이 가능 

default인 경우 동일패키지인 경우에만 접근이 가능 

private인 경우 해당 클래스에서만 접근이 가능하다. 

 

'가치코딩 [Java] > 기초문법' 카테고리의 다른 글

[Java 문법] 어노테이션  (0) 2021.02.06
[Java 문법] enum  (0) 2021.02.04
[Java 문법] 예외처리  (0) 2021.01.21
[Java 문법] 클래스  (0) 2020.12.18
[Java 문법] 선택문 및 반복문  (0) 2020.12.08

+ Recent posts