[프로그래머스] 자바 입문 PART6~9 정리
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.*;
- 패키지명 정의
- 도메인 이름이 8cruz.com 이고 프로젝트 이름이 javastudy 라면 com.eightcruz.javastudy.Hello 로 패키지를 지정
- 패키지명은 첫글자에 숫자를 사용할 수 없기에 적절히 수정해야 한다.
[파트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 메소드가 동작하여 위와 같은 값이 출력됩니다.