KEEP GOING

[프로그래머스] 자바 입문 PART6~9 정리 본문

language/java

[프로그래머스] 자바 입문 PART6~9 정리

jmHan 2022. 5. 4. 10:43
반응형

 

https://programmers.co.kr/learn/courses/5

 

자바 입문

자바 입문 가장 널리 쓰이는 프로그래밍 언어 Java로 프로그래밍의 기초를 다져보세요. 이 강의의 내용을 책으로 만나고 싶으시면 여기를 눌러 책 정보를 확인하세요. 강의를 다 들었는데, 지금

programmers.co.kr

 

[파트6. 클래스 다듬기]

[생성자]

  • 모든 클래스는 인스턴스화할 때 생성자를 사용한다.
  • 생성자는 따로 구현하지 않았을 경우, 컴파일할 때 자동 생성되는데 이를 기본 생성자라고 한다.
  • 생성자를 하나라도 만들었다면 기본생성자는 자동으로 만들어지지 않는다.
  • 생성자는 객체가 될 때 필드를 초기화 하는 역할을 수행한다.

 

[반드시 이름을 갖도록 자동차 객체를 만들고 싶은 경우]

    public class Car{
        String name;
        int number;

        public Car(String name){
            this.name = name;
        }
    }

 

[this]

현재 객체, 자기 자신을 나타낸다.

    public class Car{
        String name;
        int number;

        public Car(String name){
            this.name = name;
        }
    }

만약 Car클래스의 생성자 매개변수를 n이라 했다면,  n 이라는 변수명이 무엇을 의미하는지 잘 이해되지 않는다.

따라서 n이 아닌 매개변수에 name 으로 적는 것이 좋다.

앞의 this.name은 필드 name을, = 뒤의 name은 매개변수를 의미한다. 이는 매개변수를 필드에 대입하라는 의미이다.

 

[오버로딩]

  • 이름은 같지만 매개변수가 다른 메소드
  • 같은 이름이지만 매개변수의 유형과 개수가 다른 메소드를 여러개 가질 수 있도록 한다.

[패키지]

  • 서로 관련이 있는 클래스 또는 인터페이스들간의 묶음
  • 클래스를 패키지명과 함께 묶어서 사용함으로써 다른 패키지에 존재하는 같은 이름을 가진 클래스와의 충돌을 막는다.
  • java.lang패키지를 제외한 다른 패키지에 있는 클래스를 사용하려면 import라는 구문이 필요하다.
  • 클래스 이름대신에 * 를 적어도 된다. import com.eightcruz.javastudy.*;
  • 패키지명 정의 
  1. 도메인 이름이 8cruz.com 이고 프로젝트 이름이 javastudy 라면 com.eightcruz.javastudy.Hello 로 패키지를 지정
  2. 패키지명은 첫글자에 숫자를 사용할 수 없기에 적절히 수정해야 한다.   

 

[파트7. 상속]

[접근지정자]

  • public 어떤 클래스든 접근할 수 있다는 것을 의미
  • protected 자기 자신, 같은 패키지, 서로 다른 패키지다 하더라도 상속받은 자식 클래스에서는 접근할수 있음
  • private 자기 자신만 접근할 수 있다는 것을 의미
  • default 접근 지정자를 적지 않을 경우에 해당함. 같은 패키지에서만 접근 가능

[super와 부모생성자]

  • 클래스가 인스턴스화될 때, 생성자가 실행되어 해당 객체를 초기화한다.
  • 이때 자식 클래스인 경우, 부모 클래스의 생성자부터 실행된다.
  • 자기 자신을 가리키는 키워드가 this라면 부모를 가리키는 키워드는 super이다.
  • 부모의 생성자를 임의로 호출하지 않으면, 부모 class의 기본 생성자가 자동으로 호출된다.
public class Car {
    public Car(){
        System.out.println("Car1의 기본 생성자입니다.");
    }
}

public class Truck extends Car{
    public Truck(){
        System.out.println("Truck의 기본 생성자입니다.");
    }
}
public class TruckExam {
    public static void main(String[] args) {
        Truck t = new Truck();
    }
}

 

public class Car {
    public Car(){
        System.out.println("Car1의 기본 생성자입니다.");
    }
}
public class Truck extends Car{
    public Truck(){
    	super(); //부모 생성자를 의미
        System.out.println("Truck의 기본 생성자입니다.");
    }
}

super()은 부모 클래스의 기본 생성자를 의미하고 super()을 제거하여도 컴파일러는 알아서 기본 생성자를 먼저 호출한다.

 

 

 

[파트8. 인터페이스와 다른 형식의 클래스]

인터페이스 - 객체를 구현하기 전에 먼저 객체의 기능을 소개한 것을 의미한다.

                 - 구현하지 않은 상태이기에  객체를 생성할 수는 없음. 

                 - 자바에서 추상화를 구현하기 위해 필요한 기능

                 - 추상화를 구현하기 위한 기능으로 추상 클래스와 인터페이스가 있다. 

                 - 인터페이스를 상속받는 클래스는 인터페이스가 내장한 모든 기능을 구현해야 한다.

 

인터페이스 TV - turnOn, changeVolume, changeChannel. turnOff 소개

public interface TV {
    public int MAX_VOLUME = 100;
    public int MIN_VOLUME = 0;

    public void turnOn();
    public void turnOff();
    public void changeVolume(int volume);
    public void changeChannel(int chanel);
}

클래스 LedTV - 모두 구현

public class LedTV implements TV{
    @Override
    public void turnOn() {
        System.out.println("켜다");
    }

    @Override
    public void turnOff() {
        System.out.println("끄다");
    }

    @Override
    public void changeVolume(int volume) {
        System.out.println("소리 변경");
    }

    @Override
    public void changeChannel(int chanel) {
        System.out.println("채널 변경");
    }
}

테스트

public class TvExam {
    public static void main(String[] args) {
        LedTV tv = new LedTV();

        tv.turnOn();
        tv.turnOff();
        tv.changeChannel(15);
        tv.changeVolume(20);
    }
}

 

  • 인터페이스는 원래 추상 메소드만 가졌지만, java 8 부터는 인터페이스에서 default, static 메소드 지원
  • default 키워드로 지정하면 인터페이스 내에서 디폴트 메소드 구현 가능 
  • 인터페이스에 메소드 추가시, 구현한 모든 클래스가 해당 메소드를 구현해야 함... => 이러한 문제 해결 
  • static 메소드의 경우, 참조변수.static메소드에 접근 불가
  • static 메소드 = > 인터페이스에서 간단한 기능을 가지는 것을 도와줌

 

 

[파트9. 예외처리]

[Exception]

  • 예외 상황을 미리 예측하고 처리하는 것
public class ExceptionExam {
    public static void main(String[] args) {
        int a = 10;
        int b = 0;
        try{
            System.out.println(a/b);
        }catch(ArithmeticException e) {
            System.out.println("0으로 나누지 마");
        }finally{
            System.out.println("ㅋㅋㅋ");
        }
    }
}
  • 오류가 발생할 수 있는 부분을 try 블록으로 감싼 후, 발생할 오류와 관련된 Exception을 catch라는 블록으로 처리한다.
  • 오류가 발생했든 안했든 무조건 실행되는 finally라는 블록을 가질 수 있으며 finally 블록은 생략 가능하다.

 

[Throws]

  • 예외가 발생했을 때, 예외를 호출한 쪽에서 처리하도록 던져주는 것
public class ExceptionExam {

    public static void main(String[] args) {
        int i = 10;
        int j = 0;
        int k = divide(i, j);
        System.out.println(k);
    }

    public static int divide(int i, int j) throws ArithmeticException{
        int k = i / j;
        return k;
    }
}
  • throws ArthmeticExeption이란 divide 메소드에서 발생한 예외 사항을 메소드를 호출하는 쪽에서 처리하라는 뜻입니다.
  • catch 블록에서 사용한 toString() 메소드는 발생한 예외가 무엇인지 알려주는 역할을 합니다.
  •  

[toString]

  • 객체가 가지고 있는 정보나 값을 문자열로 리턴해주는 메서드

- 모든 클래스의 가장 최상의 클래스는 "Object" 클래스이다.

- 클래스들은 extends로 Object 클래스를 직접 상속하지 않으나, 컴파일러가 자동적으로 "Object" 클래스를 상위 클래스로 설정한다. 따라서 모든 클래스는 Object 클래스의 모든 메소드에 접근할 수 있다.

 

public class Human {
}
public class HumanTest {
    public static void main(String[] args) {
        Human hu = new Human();
        System.out.println(hu.toString());
    }
}

먼저 비어있는 Human 클래스를 생성해주고 다음과 같이 출력해주면 결과값은 위와 같은 정보가 담기게 됩니다.

이는 Object 클래스의 순수한 toString 결과값으로 기본 디폴트 값을 의미한다. 

 

public class Exam {
    public static void main(String[] args) {
        String str = "ABC";
        System.out.println(str.toString());

        File file = new File("DWWtest");
        System.out.println(file.toString());
    }
}

String 클래스 객체의 toString 메소드는 가지고 있는 값을 리턴해주고 File 클래스 객체는 자기 자신의 파일 경로를 리턴해줍니다. 따라서 String 그리고 File 클래스는 내부적으로 toString 메소드를 재정의했다는 것을 알 수 있습니다. 

 

public class Human {
    private int age;

    public void setAge(int age){
        this.age = age;
    }
    public String toString(){
        return "내 나이는: " + age;
    }
}
public class HumanTest {
    public static void main(String[] args) {
        Human hu = new Human();
        hu.setAge(26);

        System.out.println(hu.toString());
    }
}

이처럼 Human 클래스에서 toString 메소드를 재정의할 수도 있습니다. Object 클래스의 toString 메서드를 통한 의미없는 값이 아닌 오버라이딩한 toString 메소드가 동작하여 위와 같은 값이 출력됩니다.  

 

반응형
Comments