[Day 08] Java 0406 - 내용 정리

Doyeon Kim·2022년 4월 6일
1

Java

목록 보기
10/16
post-thumbnail

🌞final

  • 클래스의 멤버변수명 앞에 사용
    - 변수이기는 하지만 상수처럼 사용하고자 할 때 사용한다.
int a = 10;
a=5; //a값이 5로 바뀔 수 있다.

final int b = 10;
b = 10; //이것은 오류가 남. 정해진 특정 값 이외에 다른 값을 넣으면 안 될 때 오류를 발생시켜준다.
  • 상수는 모두 대문자로 표현하여 일반 멤버변수와 구분한다.
  • 클래스의 멤버메소드명 앞에 사용
    - 자식클래스에서 오버라이딩을 금지
  • 클래스의 클래스 이름 앞에
    - 상속금지

🌞super와 super()

🌈super

  • 상속관계에 있을 때 부모클래스에 있는 멤버와 똑같은 이름의 멤버를 자식클래스에서 만들면 부모에 있는 동일한 이름의 멤버는 가려지게 된다.
  • 이 때 부모의 동일한 이름의 멤버에 접근하기 위하여 super를 사용한다.
  • 예를들어, 부모클래스에도 hello() 메소드가 있고, 자식클래스에도 hello() 메소드가 있다면, hello()를 호출하면 자식클래스의 hello()가 동작한다.
  • 부모에 있는 hello를 동작시키려면 super.hello()라고 한다.

🌈super()

  • 상속관계에 있을 때 부모의 생성자를 요구하고자 할 때 super()를 사용한다.
  • 이 때에는 반드시 첫 문장에 와야한다.
  • 자식의 생성자에서 맨 첫 번째 문장에 부모의 기본생성자를 요구하는 super()가 생략되어 있다.
  • 내가 쓰지 않아도 자동으로 요구된다.
  • 만약, 기본생성자가 아니고 매개변수를 갖는 생성자를 동작시키고자 한다면 반드시 super(값1, 값2, ...)로 명시해야한다.

🌞추상메소드와 추상클래스

  • 미래에 만들어질 자식클래스들이 공통으로 가져야 할 속성과 동작들을 모아서 미리 부모클래스를 만들 수 있다.
  • 이 때, 어떠한 동작이 반드시 자식클래스에 있어야 하지만, 부모클래스를 만드는 시점에서 그 내용을 구체화할 수 없다.
  • 이러한 메소드는 메소드의 몸체(body) { } 를 구체화 하지 않고, 메소드 선언문만 적는다.
  • 이러한 메소드를 "추상메소드"라고 한다.
  • 이 때는 메소드 이름 앞에 abstract 키워드를 붙여준다.
  • 이렇게 어떤 클래스가 추상메소드를 하나라도 포함하고 있으면 그 클래스를 "추상클래스" 라고 한다.
  • 이 클래스 이름 앞에도 abstract 키워드를 써준다.

🌞has a, is a

  • 자바로 만들어진 소프트웨어 속을 들여다보면 수 많은 클래스들로 구성되어 있다.
  • 그 클래스들은 has a 관계이거나 is a 관계에 있다.
  • 예를들어, A라는 클래스가 있고 B클래스가 멤버변수로 A클래스의 객체를 갖는다고 하면 B has a A의 관계이다.
	사자는 동물입니다. (o)
	동물은 사자입니다. (x)
  • 상속관계에 있는 클래스를 is a 관계라고 한다.
  • is a 관계에 있는 부모클래스의 참조변수는 자식클래스의 객체를 참조할 수 있다.
  • 만약, 부모클래스의 참조변수로 자식클래스의 객체를 생성한 후 오버라이딩한 메소드를 호출하면 자식클래스의 메소드가 동작한다.
  • 자식클래스에 새로 추가된 메소드는 바로 호출할 수 있다.
  • 자식클래스로 형 변환 후 호출해야 한다.

🌞정리

🌻 this와 this()에 대하여 설명하세요.

  • this는 인스턴스 자신을 가리키는 참조변수이고, this()는 생성자를 뜻한다.
  • this는 변수와 지역변수를 구분하기 위해서 사용한다.
  • this()는 같은 클래스의 다른 생성자를 호출할 때 사용한다.

🌻 instanceof 연산자의 필요성에 대하여 설명하세요.

  • instanceof 연산자는 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용한다.
  • 주로 조건문에 사용되며, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치한다.
  • 그리고 연산의 결과로 boolean 값인 true, false 중의 하나를 반환한다.
  • 즉, instanceof를 이용한 연산결과로 true를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻한다.

🌞예제

🌟(final - 클래스 변수명 앞에 올 경우)예제1🌟

//final 클래스 변수명 앞에 올 경우

class Person {
	String name = "홍길동";
	int age = 20;
	final static String ADDR = "서울시 마포구 서교동"; //final이면 static이다. (상수는 모두 대문자로 표현하여 일반 멤버변수와 구분한다.)
	//final은 어차피 못 바꾸는 것이라서 객체마다 따로 메모리를 잡을 필요가 없다.
	//그래서 final이면 static으로 만들어서 모든 객체가 같이 사용한다.
}

public class FinalTest01 {

	public static void main(String[] args) {
		Person p1 = new Person();
		Person p2 = new Person();
		
		p1.age = 21;
		p2.age = 31; //값이 변할 수 있음.
		
		//p1.ADDR = "제주도 서귀포시 애월읍"; //final로 값을 주었기 때문에 대입해서 값을 바꿀 수 없음. 오류가 발생
		//p2.ADDR = "경기도 파주시" //addr은 상수이기 때문에 값을 변경할 수 없다.

	}

}

🌟(final - 클래스의 메소드 앞에 올 경우)예제2🌟

//final 클래스의 메소드 앞에 올 경우
class A {
	public void pro() {
		System.out.println("A의 pro 입니다.");
	}
	public final void hello() { //자식이 오버라이딩 하지 못하게 final 사용
		System.out.println("hello 입니다.");
	}
}


class B extends A {
	public void pro() {
		System.out.println("B의 pro입니다.");//오버라이딩함.(자신에게 맞게끔)
	}
//	public void hello() { //부모로부터 물려받은 final메소드는 오버라이딩 할 수 없다.
//		
//	}
}

public class FinalTest02 {

	public static void main(String[] args) {
		

	}

}

🌟(final - 클래스의 클래스 이름 앞에 올 경우)예제3🌟

//final 클래스의 클래스 이름 앞에 올 경우
final class Bird {
	String name;
	String color;
	boolean wing;
	
	public void fly() {
		System.out.println("훨~훨~");
	}
}

//final 클래스는 상속받을 수 없다.
//class Plane extends Bird { 
//	
//}


public class FinalTest03 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

🌟(super)예제4🌟

class A {
	String title = "hello";
	int year = 2022;
}

class B extends A {
	String title = "java";
	String addr = "서울";

	public void info() {
		System.out.println("year: " + year);
		System.out.println("addr: " + addr);
		System.out.println("title: " + title);
		System.out.println("부모의 title: " + super.title); //부모의 title을 출력하고 싶을 때 super.title 
	}
}

public class SuperTest {

	public static void main(String[] args) {
		B ob = new B();
		
		ob.info();
	}

}

🌟(super())예제5🌟

class Person {
	String name;
	int age;

	public Person(String name, int age) {
		super();
		this.name = name;
		this.age = age;
	}

}

class Student extends Person {
	String major;
	
	public Student(String name, int age, String major) {
		super(name, age); //부모의 매개변수를 갖는 생성자를 동작시킴.
		this.major = major;
	}
}

public class SuperTest02 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub

	}

}

🌞연습문제

👑연습문제1👑

마트에서 판매되는 물건을 클래스 Product로 나타내자. Product 클래스에서 상속받아서 할인 물건을 나타내는 DiscountProduct 클래스를 작성할 수 있다.

class Product { // 판매되는 물건
	protected String name;
	protected int price; //물건의 가격

	public double getPrice() {
		return price;
	}

	public Product(String name, int price) {
		super();
		this.name = name;
		this.price = price;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}


	public void setPrice(int price) {
		this.price = price;
	}

	@Override
	public String toString() {
		return "Product [name=" + name + ", price=" + price + "]"; // + ", getName()=" + getName() + "]";
	}

}

class DiscountProduct extends Product {
	private double discount;
	private double discount_price;

	public DiscountProduct(String name, int price, double discount) {
		super(name, price);
		this.discount = discount;
	}

	@Override
	public double getPrice() {
		discount_price = price - ((price/100)* discount);
		return discount_price;
	
	}

	@Override
	public String toString() {
		return "DiscountProduct [discount=" + discount + ", name=" + name + "]";
	}
	
	
}

public class ProductTest {

	public static void main(String[] args) {
		Product p1 = new Product("toothbrush", 3000);
		Product p2 = new DiscountProduct("toothbrush", 3000, 15);
		System.out.println(p1.getPrice());
		System.out.println(p2.getPrice());
		System.out.println(p1);
		System.out.println(p2);
	}

}
profile
꾸준히 성장하는 개발자✨

0개의 댓글

관련 채용 정보