Everyday Dev System

0523_TIL : Java 3주차 강의에서 새로 알게된 것 본문

내배캠 주요 학습/TIL : Today I Learned

0523_TIL : Java 3주차 강의에서 새로 알게된 것

chaeyoung- 2023. 5. 23. 20:36

 

#새롭게 알게된 것들 :

 

 

1. 가변길이의 매개변도 선언 가능

void carSpeeds(double ... speeds) {
	for(double v : speeds) {
    	System.out.println("v= " + v);
    }
}

carSpeeeds(100,200,300);

 

 

2. 참조형 매개변수는 주소값이 넘어오므로 값이 변경됨.

** 기본형 매개변수는 주소값이 아니라 값을 복사해서 넘겨주는 것이므로 원본데이터에 영향x

 

package org.example.week3.parameter;

public class Main {
    public static void main(String[] args) {
        Car car = new Car(); // 객체 생성

        // 기본형 매개변수
        char type = 'D';
        car.brakePedal(type);

        // 메서드 실행 완료 후 전달할 매개값으로 지정된 type 값 확인
        System.out.println("type = " + type); // 기존에 선언한 값 'D' 출력, 원본 값 변경되지 않음
        // 메서드 실행 완료 후 반환된 car 인스턴스의 gear 타입 확인
        System.out.println("gear = " + car.gear); // 객체 내부에서 type을 변경하여 수정했기 때문에 'P' 출력

        System.out.println();
        // 참조형 매개변수
        Tire tire = new Tire();
        tire.company = "금호"; // 금호 타이어 객체 생성

        // 차 객체의 타이어를 등록하는 메서드 호출한 후 반환값으로 차 객체의 타이어 객체 반환
        Tire carInstanceTire = car.setTire(tire);

        // 메서드 실행 완료 후 전달할 매개값으로 지정된 참조형 변수 tire의 company 값 확인
        System.out.println("tire.company = " + tire.company); // "KIA" 출력
        // 전달할 매개값으로 지정된 tire 인스턴스의 주소값이 전달되었기 때문에 호출된 메서드에 의해 값이 변경됨.

        // 메서드 실행 완료 후 반환된 car 인스턴스의 tire 객체 값이 반환되어 저장된 참조형 변수 carInstanceTire의 company 값 확인
        System.out.println("carInstanceTire.company = " + carInstanceTire.company); // "KIA" 출력
    }
}

 

 

 

3. 인스턴스 멤버 & 클래스 멤버

 

- 선언하는 방법이 상이함.

- 인스턴스 멤버는 객체 생성 후에 사용가능, 클래스 멤버는 객체 생성 없이도 사용 가능

  모든 객체의 인스턴스 필드는 각각의 인스턴스마다 고유한 값을 가짐.

 

- 클래스 멤버

  클래스는 java의 클래스 로더에 의해 메서드 영역에 저장되고 사용되어 고정적인 위치를 차지한다.

  필드와 메서드를 클래스 멤버로 만들기 위해서는 static 키워드 사용

  클래스 멤버 사용방법 - 클래스 이름으로 접근하는 것이 좋다!!

Car.company = "Audi";

// 안좋은 접근법
Car car = new car();
car.company = "Ferrari";

 

 

4. main에는 기본 생성자가 내장되어 있어서 인스턴스화가 가능하다.

package org.example.week3.sample;

public class Main {
    public static void main(String[] args) {
        Main main = new Main();
        System.out.println(main.getNumber());

    }

    public int getNumber() {
        int number = 1;
        number += 1;
        return number;
    }
}

 

 

5. final로 선언된 상수는 변수명 모두 대문자로 해야 함.

ex) INT_VALUE

 

 

6. 부모 클래스에 final이 붙으면 최종적인 클래스가 됨으로 더 이상 상속할 수 없는 클래스가 된다.

 

 

7. 자식 클래스와 부모클래스 형변환

부모 클래스가 Mammal, 자식 클래스가 Whale

Mammal mammal = new Whale();
mammal.swimming(); // 오류 발생

# 이유 : swimming 메서드는 자식 클래스에만 선언이 되어 있으므로, Mammal 타입의 mammal 인스턴스는 swimming을 사용할 수 없다. 즉, 부모 클래스에 swimming 메서드가 없어서 사용 불가

 

Whale whale = new Mammal(); // 오류 발생

자식 클래스가 더 작기 때문에 부모 클래스 타입의 캑체는 자식타입의 병수로 변환 불가.

** 예외적으로 위 Mammal mammal = new Whale()과 같이 자동형변환이 완료된 애들만 다시 자식 클래스로 형변환이 가능하다.

 

 

8. 인터페이스 주의사항

- 모든 멤버변수는 public static final 이어야 한다.

- 모든 메서드는 public abstract 이어야 한다.

- 인터페이스의 추상 메서드는 구현될 때 반드시 오버라이딩 되어야 한다.

- 만약 인터페이스의 추상 메서드를 일부만 구현해야 한다면 해당 클래스를 추상 클래스로 변경

- 인터페이스 간의 상속은 extends 키워드 사용! 

* 일반 클래스는 다중 상속 불가

public class Main implements C {

	@override
    public void a() {
    System.out.println("A");
    }
    	
    @override
    public void b() {
    System.out.println("B");
    }
}

interface A {
	void a();
}

interface B {
	void b();
}
interface C extends A, B { }

public class 클래스명 implements 인터페이스명