230224_자바 기초2

왕감자·2023년 2월 24일
1

강의 메모

목록 보기
2/6

형변환

☝️자바 컴파일러는 안전하다고 판단되면 자동으로 형변환을 해준다.

class Main{
		public static void main(String[] args) {
				// 페라리 리모콘을 자동차 리모콘으로 바꾸어서 a자동차 변수에 넣는다.
        자동차 a자동차 = new 페라리();
				
				// 버튼을 추가할 일만 남아서(컴파일 에러)
				페라리 a페라리 = a자동차;
    }
}	

class 자동차{
		void 가속() { }
		void 감속() { }
}

class 스파크 extends 자동차{
		void 좁은곳에주차() { }
}

class 페라리 extends 자동차{
		void 뚜껑열기() { }
}

리모콘이 상위(추상)타입으로 변하는 경우는 버튼이 제거될 가능성만 존재한다.

자바는 버튼을 제거하는 것은 불편해지지만, 안전하다고 판단한다.

리모콘이 하위(구체적)타입으로 변하는 경우는 버튼이 추가될 가능성만 존재한다.

자바는 버튼이 추가되는 것은 편리해지지만, 위험하다고 판단한다.


상속과 구성

상속(Inheritance)

(is-a 관계)

class 도형{ }

class 삼각형 extends 도형 {
		int w;
}

❗ 자바에서 상속을 하는 이유 ❗

  • 코드의 확장성, 재사용성이 용이
  • 중복된 코드를 상위 클래스로 뺐으므로 코드가 간결해진다.

유지보수가 쉬워진다. 👍


하지만 상속에는 단점이 있다.

상속은 하위 클래스가 상위 클래스에게 많이 의존한다.

이 말은 하위 클래스에 적합하지 않는 메소드가 상속되기도 하고,

상위 클래스의 결함이 그대로 넘어오고, 동시에 수정이 되어버리는 문제가 생긴다.

결합도가 높아진다. ➡ 안 좋은 코드


구성을 지향해야 한다!


구성(Composition)

(has-a 관계)

class 도형{ }

class 삼각형 {
		int w;
		각 a1 = new();
}

class{ 
		...

		void setAngle(){ }
		void getAngle(){ }
}

다른 객체를 받아들여서 그 객체의 기능을 사용하는 것

받아들인 객체의 변수와 메소드를 사용할 수 있다.

예시) 삼각형 클래스가 각 클래스를 가지고 있으면 각 클래스의 기능을 사용할 수 있다.


생성자

객체가 생성될 때 자동으로 호출되고 객체의 초기화를 위해 사용된다.

  • 생성자 메서드()는 클래스 이름과 동일해야 한다.
  • 매개변수 조건에 따라서 여러 개를 작성할 수 있다. (오버로딩)
  • 생성자 코드가 없을 경우에는 컴파일러가 기본 생성자를 자동으로 생성한다.
  • 리턴 타입 X

this()

생성자 내부에서만 사용할 수 있고, 같은 클래스의 다른 생성자를 호출할 때 사용

class 전사 {
		String 이름;
		int 공격력;

		//this() 사용
		전사(){
				this("길동", 100);
		}

		전사(String 이름){
				this.이름 = 이름;
		}
		
		//오버로딩
		전사(String 이름, int 공격력){
				this.이름 = 이름;
				this.공격력 = 공격력;
		}
}

추상클래스(Abstract Class)

구체적이지 않은 클래스

상위 클래스에는 메서드만 정의해놓고
그 메서드의 실제 동작은 메서드를 상속받은 하위 클래스로 책임을 넘긴다.

추상 클래스를 상속받은 클래스는 추상 클래스가 가진 추상 메소드를 반드시 구현해야 한다.

abstract class 사람{
	void 말하다(); 
	abstract void 쉬다(); // 추상 메소드
}

인터페이스(interface)와 구현(implements)

class 사람{
		void 말하다();
}

public interface 변호사 {
		abstract void 변호하다();
}

//홍길동이 사람이고 변호사일 때
class 홍길동 extends 사람 implements 변호사 { }

implements 뒤에 오는 것은 인터페이스만 가능하다. (클래스 X)

인터페이스는 100% 추상 메소드


접근제한자

  • public
    외부에 공개되고, 외부에서 접근 가능
  • private
    외부로 공개되지 않고, 리모콘에 노출되지 않는다.
    기본적으로 private을 붙이는 것이 맞다.

예외처리

  • 모든 예외는 Exception이라는 클래스를 상속받는다.

1. try catch finally

try{
		/* 예외가 발생할 만한데 
			 실행하고 싶은 코드  */
} catch (Exception e){
		// 컴파일 에러
} catch (IOException e){
		// 입출력 에러
} finally {
		// 예외처리가 일어나든 말든 무조건 실행하는 코드
}

2. throws

static int divide(int a,int b) throws ArithmeticException {
	if(b==0) throw new ArithmeticException("0으로 나눌 수 없습니다.");
	int c=a/b;
	return c;
}
public static void main(String[] ar){
	int a=10;
	int b=0;
	int result=0;
		
	result = divide(a,b);
	System.out.println(result);
}

3. 예외처리 클래스를 만들고 싶을 때

class 배열_불량_Exception extends Exception { }
profile
감자 심기

0개의 댓글