본문 바로가기

Java

로아랑 서버구축을 위한 공부 3일차

이것이 자바다(책) Chap6 ~ Chap10

 

기억에 남는 부분 메모

 

1. 한 파일에 public class는 하나만 생성가능

 

2. 한 파일에 public class와 다른 class를 또 생성하면 다른 파일로 분류됨

public class SportsCar {
    Tire leftTire = new Tire();
}

class Tire {

}

3. 클래스 생성자 변수 관련

자바에서는 파라미터를 변경할 수 있다. 예를 들어

public static void main(String[] args) {
    printMessage("안녕");
}

public static void  printMessage(String message) {
    message = "변경된 메세지~";
    System.out.println(message);
}

//변경된 메세지~

이렇게 된다 그래서 Swift처럼 필드 변수와 생성자 파라미터 명이 같으면 this키워드(swift의 self같은거인 듯)를 붙여주거나 파라미터명과 필드 변수 명을 다르게 해줘야 한다.

public class Student {
    String name;
    Student(String n) {
        name = n;
    }
}

or

public class Student {
    String name;
    Student(String name) {
        this.name = name;
    }
}

 

4. 가변 매개변수

매개변수의 개수가 여러개가 된다면 배열로 전달하지 않고 가변매개변수로 전달 가능

void printFriends(String ... friends) {
    for (String friend : friends) {
        System.out.println(friend);
    }
}

Student객체에 printFriend메서드를 가변 매게변수를 받도록 정의(String ... friends) -> String타입이 여러개 있는 friends를 받겠다!

Student s1 = new Student("김나박이");
s1.printFriends("허각", "신용재", "임재현");

그럼 사용하는 곳에서 이렇게 사용 가능

private String[] friends;
void printFriends(String ... friends) {
    this.friends = friends;

근데 이 가변 매개변수는 아예 배열로 사용이 가능 한듯. 이렇게 String배열 필드 변수 선언해놓고 할당 가능

 

5. static 메서드

static void study(String subjec) {
    System.out.println(subjec + " 과목 시작!");
}

이런식으로 선언하는데 Swift와 마찬가지로 클래스명.메서드명 으로 사용가능하고 클래스 내부값에 접근은 못하는 그런 뭐...암튼 클래서 생성 안하고 사용할 수 있는 똑같은 기능 어쩌고...

 

+ 인스턴스 멤버를 사용하지 않거나 객체마다 공통적으로 갖는 성격등은 static 변수, 메서드로 선언하는 것이 좋다고 책에서 하는데 왜일까? 를 그대로 채찍피티한테 물어보니...

이렇답디다.

난 지금까지 4번 접근의 용이성만 보고 이렇게 선언했었는데 1, 2번의 이유로도 충분히 고려할 만한 사항인 것 같다.

 

6. final키워드

swift의 let과 비슷한데 차이점이 있다. -> swift에서 객체가 let으로 선언되면 해당 인스턴스 교체는 물론 인스턴의 속성도 변경이 불가하지만 java의 final은 해당 인스턴스 교체는 안되지만 인스턴의 속성 변경은 가능하다.

 

7. 다른 패키지(폴더)에 있는 객체 생성시 어떤 위치의 어떤 클래스인지 import해야함

//import thisisjava.SportsCar;

public class StudentEx {
    public static void main(String[] args) {
        Student s1 = new Student("김나박이");
        thisisjava.SportsCar car = new thisisjava.SportsCar();
    }
}

근데 애초에 이런식으로 패키지 명까지 다 써주면 import안해줘도 됨

 

-> 백엔드 개발자들 코드 슬쩍 봤을 때 import가 왜이렇게 많은가 했더니 이런 이유였던거시어따

 

8. 접근 제한자

- public : 제한 범위 없음

- protected : rkxdms vozlwl ghrdms wktlr rorcp

- (default) : 접근제한자가 붙지 않은 상태, 같은 패키지

- private : 객체 내부

 

9. 상수(static final)

static final 키워드로 생성된 필드를 상수라고 하며 상수의 경우 카멜케이스가 아닌 대문자로 표시 및 띄어쓰기는 언더바로 구분

 

10. 클래스 상속

- 상속시 부모 클래스 생성자는 반드시 작성해줘야함

- 부모 클래스 생성자에 파라미터가 없다면 자식 클래스 생성시 super(); 안적어줘도 컴파일시 자동 추가됨

- 부모 클래스 생성자에 파라미터가 있으면 자식 클래스 생성시 super(부모 클래스 파라미터); 적어줘야함

- override 할 때는 @override키워드를 붙이면 컴파일 단계에서 오버라이드가 문제없이 됐는지 확인해줌

- super.메서드이름() 하면 부모 메서드 실행하고 추가로 작성, 없으면 아예 재정의

 

11. 타입 확인

Phone a = new SmartPhone("d", "d", true);
boolean result = a instanceof SmartPhone;
System.out.println(result);
//true

SmartPhone객체를 타입 Phone으로 생성 했으나 해당 객체를 판단하는 instanceof를 통해 SmartPhone임을 알아낼 수 있음

두 번째 줄의 a.wifi;를 보면 a의 타입은 Phone이기 때문에 SmartPhone의 변수인 wifi에 접근 못함

하지만 if 구문을 통해 타입캐스팅이 가능하고 캐스팅 된 걸 sp라는 변수에 할당해서 사용가능

 

12. 추상 클래스

추상화를 위한 클래스용도로 생성되며

public abstract class Phone {
}

위와 같이 abstract키워드를 붙여 생성, Swift의 protocol 같은 거이고 마찬가지로 Phone은 상속만 가능하고 생성 못함

abstract void sendMessage();

abstract키워드 붙여서 블록없이 생성하면 상속받은 곳에서 해당 메서드 정의하라고 오류 뜸

 

단일 상속만 가능

 

13. 봉인된 클래스

public sealed abstract class Phone permits SmartPhone {}

sealed키워드를 붙이고 permits을 통해 뒤에 올 클래스만 상속 받을 수 있게 제한 가능

그럼 상속받는 곳에서는 non-sealed를 통해 봉인을 풀거나 상속하지 않을거라는 final 키워드 붙여야만 상속 받을 수 있음

public non-sealed class SmartPhone extends Phone {}
//Or
public final class SmartPhone extends Phone {}

자주 사용할지는 모르겠음

 

14. 인터페이스

Swift의 protocol이랑 비슷한듯(추상 메소드만 만들고 다중상속 가능하고)

근데 변수는 못가짐. static final로 선언된 상수는 가질 수 있는데(인터페이스를 사용하는 객체들의 공통된 값이라고 해야하나..) 이 부분이 다름

 

실제로 상속을 이용한 다형성 구성시 추상 클래스보다 인터페이스를 많이 활용한다고 한다.

public interface RemoteControl {
    public void turnOn();
}

class Television implements RemoteControl {
    @Override
    public void turnOn() {
        System.out.println("티비를 킨다.");
    }
}

class Radio implements RemoteControl {
    @Override
    public void turnOn() {
        System.out.println("라디오를 킨다.");
    }
}

RemoteControl이라는 인터페이스를 만들고 그거로 구현한 Television과 Radio를 만든다

 

public class RemoteAct {
    public static void main(String[] args) {
        RemoteControl device = new Television();
        device.turnOn();
        //티비를 킨다
        device = new Radio();
        device.turnOn();
        //라디오를 킨다
    }
}

 

그리고 RemoteControl타입의 device를 처음에는 Television으로 초기화를 하고 trunOn실행

그리고 Radio로 다시 초기화를 한 뒤 trunOn 실행하면 각 객체에 맞는 기능이 실행되고 다형성이 충족됨

 

public interface RemoteControl {
    int age = 0;
    public void turnOn();
    default void turnOff() {
        System.out.println("장치를 끕니다.");
    }
}

defalut를 키워드로 메서드 생성하면 메서드 내부를 인터페이스에서 구현할 수 있으며 이는 상속받은 객체에서 재정의 해주지 않아도 사용가능

단, 상속받은 객체에서 재정의도 가능하긴 한데 재정의 하려면 public키워드를 꼭 붙여주어야 한다.

@Override
public void turnOff() {
    System.out.println("티비를 끈다");
}

 

그리고 인터페이스도 인터페이스를 상속 할 수 있는데 구현부에서 implement를 사용하는 것과 다르게 extends키워드로 상속받고 여기서도 역시 다중 상속 가능

 

그리고 클래스 상속과 마찬가지로 instanceof, sealed 사용 가능

 

15. 여러클래스와 관계를 맺을 때는 독립적으로 선언하는게 좋으나 단일 관계를 맺을 때는 중첩클래스로 선언하는게 유지보수에 좋다.

- 클래스 멤버로 선언되는 클래스 -> 멤버 클래스

- 메소드 내부에 선언되는 중첩 클래스 -> 로컬 클래스

 

16. 라이브러리 생성 및 사용

이것이 자바다 책에서는 이클립스 기준으로 설명하기에 아래 블로그로 대체

 

https://atoz-develop.tistory.com/entry/JAVA-IntelliJ-IDEA-jar-%ED%8C%8C%EC%9D%BC-export-import-%EB%B0%A9%EB%B2%95

 

[JAVA] IntelliJ IDEA - jar 파일 export, import 방법

1. JAR 파일 Export 위 예시 프로젝트의 JarExample 모듈을 jar 파일로 export 하려한다. IntelliJ는 한 프로젝트 안에 다수의 모듈을 가질 수 있다. 지금은 하나의 모듈만을 갖고있는 상태이다. 1 2 3 4 5 6 7 8 9

atoz-develop.tistory.com

 

17. 모듈 생성 및 사용

이것이 자바다 책에서는 이클립스 기준으로 설명하기에 아래 블로그로 대체

 

https://hjjungdev.tistory.com/60

 

인텔리J(IntelliJ)에서 프로젝트와 모듈을 생성하는 방법을 알아보자!

1. IntelliJ와 Eclipse 비교 인텔리J와 이클립스는 자바개발IDE의 양대산맥이라고 할 수 있다. 이클립스는 무료, 인텔리J는 상용 IDE 프로그램이다. 대다수의 자바개발자가 입문을 하면서 처음으로 쓰

hjjungdev.tistory.com

https://nooblette.tistory.com/m/entry/Java-%EB%A9%80%ED%8B%B0%EB%AA%A8%EB%93%88-%ED%94%84%EB%A1%9C%EC%A0%9D%ED%8A%B8%EC%9D%91%EC%9A%A9-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%A8-%EB%AA%A8%EB%93%88%ED%99%94%ED%95%98%EC%97%AC-%EA%B5%AC%EC%84%B1%ED%95%98%EA%B8%B0

 

[Java] 멀티모듈 프로젝트(응용 프로그램 모듈화하여 구성하기)

목차 배경 자바 기본 개념을 공부하던 중에 Java 9 부터 제공되는 모듈에 대한 소개가 인상깊어 기록해두었다. 실무에서 사용되는 프로젝트를 보면 규모가 커지면서 협업과 유지보수에 어려움을

nooblette.tistory.com