[Day 07] Java 0405 - 내용 정리

Doyeon Kim·2022년 4월 5일
1

Java

목록 보기
9/16
post-thumbnail

🌞메소드의 중복(Method Overloading)

  • 생성자를 중복할 수 있는 것 처럼 같은 이름의 메소드를 여러 개 중복할 수 있는 것을 말한다.
  • 메소드 중복이 되기 위해서는 매개변수의 개수가 다르거나 자료형이 달라야한다.

🌞클래스 변수와 클래스 메소드(static 변수, static 메소드) == 정적변수, 정적메소드

🌈클래스 변수

  • 멤버 변수명 앞에 static 키워드가 붙어있는 변수를 말하며, 모든 ㄱ개체와 무관하게 사용할 수 있으며, 모든 객체가 공동으로 사용할 수 있다.

🌈클래스 메소드

  • 메소드명 앞에 static 키워드가 붙어있는 메소드를 말하며 객체와 무관하게 호출할 수 있는 메소드를 말한다.

클래스 변수와 클래스 메소드는 객체와 무관하게 사용할 수 있기 때문에 클래스 이름으로 접근한다.


🌞값에 의한 호출, 참조에 의한 호출

🌈값에 의한 호출(Call By Value)

  • 메소드 호출 시에 기본자료형이 전달되는 것을 말한다.
  • 메소드 안에서 전달된 값이 변경되더라도 호출하는 쪽에는 변경된 내용이 적용되지 않는다.

🌈참조에 의한 호출(Call By Reference)

  • 메소드 호출 시에 참조자료형(객체, 배열)이 전달되는 것을 말한다.
  • 메소드 안에서 전달된 값이 변경될 때에 호출하는 쪽에서 변경된 내용이 적용된다.

🌞클래스의 상속

  • 이미 만들어진 클래스를 확장하여 새로운 클래스를 만들 수 있다.
  • 코드의 재사용성을 높일 수 있다.
  • 상속하기 위해서는 extends 키워드를 사용한다.
  • 상속을 해 준 클래스를 "부모클래스" 라고 하고, 상속을 받은 클래스를 "자식클래스" 라고 한다.
class A { //상속을 해준 부모클래스

}

class B extends A { //A를 확장하겠다. 상속을 받은 자식클래스 B, B는 A에 있는 모든 속성과 동작을 그대로 물려받는다.

}

🌞protected

  • 상속관계에 있을 때에 아무리 자식클래스라 할지라도 부모클래스의 private 영역에는 접근할 수 없다.
  • 그래서 외부의 다른 클래스로 부터는 보호하되 상속한 자식클래스들에게는 접근을 허용하기 위해서 protected를 사용한다.

🌞생성자

  • 객체가 생성 시 자동 수행된다.

🌞상속과 생성자

  • 상속관계에 있을 때 자식의 객체를 생성하면 부모의 생성자가 먼저 동작하고 자식의 생성자가 동작한다.
  • 부모의 생성자를 요구하기 위해서는 super()를 사용한다.
  • 이 때에는 반드시 생성자의 첫 번째 문장에 와야한다.
  • 상속 관계에 있을 때에 부모클래스, 자식클래스 모두 생성자를 만들지 않으면 긱본 생성자가 제공되어 자식클래스 생성 시에 자동으로 부모의 기본생성자가 요구되어 객체를 생성할 수 있다.
  • 만약, 부모클래스에 매개변수를 갖는 생성자를 만들고 따로 기본생성자를 만들지 않고 자식클래스에도 생성자를 만들지 않은 상태에서 자식클래스의 객체를 생성하게 되면 부모의 기본생성자를 요구하기 때문에 오류가 발생한다.
  • 문제를 해결하기 위해서는 부모클래스에 기본생성자를 만들어 주거나 자식의 생성자에서 부모의 super()를 사용하여 부모의 매개변수를 갖는 생성자를 요구하도록 한다.

🌞메소드 오버라이딩

  • 상속관계에 있을 때에 부모클래스의 메소드가 자식클래스에는 맞지 않아 다시 정의(재정의) 하는 것을 말한다.
  • 메소드 오버라이딩은 메소드 이름뿐 아니라 매개변수의 개수와 자료형까지 일치되게 재정의 해야 한다.

🌞toString, equals

  • toString과 equals는 자바의 제일 조상인 Object의 메소드이며, 필요하다면 자신의 클래스에 맞도록 재정의하여 사용한다.
  • 만약, 출력문에 객체를 표현하고자 한다면 toString을 오버라이딩하고, 두 개의 객체가 서로 동일한 속성 값을 갖고 있는지 판별하려면 equals 메소드를 재정의 하여 사용한다.

🌞Object

  • 자바의 모든 클래스들은 Object 클래스의 후손이다.
  • 자바가 제공하는 모든 클래스들의 제일 조상 클래스는 Object이다.
  • 우리가 만든 모든 클래스들도 묵시적으로 Object의 후손이 된다.

🌞정리

🌻 메소드 오버라이딩과 메소드 오버라이딩에 대하여 설명하세요.

  • 오버로딩은 하나의 클래스 안에서 같은 이름의 메소드를 여러 개 정의하는 것을 뜻한다.
  • 오버라이딩은 부모클래스로부터 상속받은 메소드의 내용을 변경(재정의)하여 사용하는 것을 말한다.
  • 즉, 오버로딩은 같은 이름의 메소드를 생성하여 사용하는 것이고, 오버라이딩은 부모로부터 상속받은 메소드를 재정의하여 사용하는 것이다.
  • 메소드 오버라이딩에는 상속이란 말이 반드시 들어가야 한다 !

🌞예제

🌟예제1🌟

class Person {
	String name; // 일반 변수들은 객체를 생성해야만 메모리 공간이 확보된다.
	int age;
	static String addr; // 클래스 변수 -> 객체와 무관하게 사용하거나 모든 객체가 공동으로 사용하는 기억공간
	
	public void sayHello() { //일반 메소드
		System.out.println("안녕, " + name);
	}
	
	public static void pro() { //객체와 무관하게 객체없이도 동작하고 싶을 때 앞에 static을 붙여준다. ==> 클래스메소드
		System.out.println("Person의 pro 입니다.");
		//System.out.println(name); //name, age는 static 안에서 접근 할 수 없다.
		System.out.println(addr); //가능
		//static 메소드(클래스메소드) 안에서는 static 멤버(클래스변수, 클래스메소드)에만 접근할 수 있다.
		//객체를 생성해야만 확보되는 일반멤버에는 접근할 수 없다!
	}
}

public class PersonTest {

	public static void main(String[] args) {
		
		Person.pro(); //static 메소드는 객체와 무관하게 호출할 수 있다. 클래스 이름으로 접근한다.
		
		Person.addr = "서울시 마포구 서교동"; // 객체 없이 접근해야 하므로 클래스 이름으로 접근한다. ==> 클래스변수
		System.out.println(Person.addr);

		Person kim = new Person(); // 객체생성 , 객체를 생성해야지만 위에 class Person에 있는 name과 age 세트만큼 메모리가 잡힌다.
		Person lee = new Person(); // lee와 kim의 name, age는 별도의 메모리
		kim.name = "김민혁";
		kim.age = 28;

		lee.name = "이진주";
		lee.age = 26;
		
		kim.sayHello();
		lee.sayHello(); //일반 멤버 메소드는 반드시 객체를 생성하고 그 객체를 통해서 사용할 수 있다.

		System.out.println(kim.name + ", " + kim.age + ", " + kim.addr); // 객체가 있으면 객체를 통해서도 접근할 수 있다.
		System.out.println(lee.name + ", " + lee.age + ", " + lee.addr);

		kim.addr = "제주도 서귀포시 애월읍"; // 공동으로 사용하는 기억공간이기 때문에 모든 addr이 바뀐다.
		System.out.println(kim.addr); // 객체가 있으면 객체를 통해서도 접근할 수 있다.
		System.out.println(lee.addr);
		System.out.println(Person.addr);
	}

}

🌟예제2🌟

class Person { //부모의 생성자가 먼저 동작한다.
	public Person() {
		System.out.println("Person의 생성자 동작함!");
	}
}

class Customer extends Person { // 부모의 생성자가 동작한 후에 자식의 생성자가 동작한다.
	public Customer() {
		//super(); //부모의 매개변수를 갖지 않는 생성자 ==> 기본생성자를 요구하는 명령이 생략되어있다.
		System.out.println("Customer의 생성자 동작함.");
	}
}
 
public class PersonTest {

	public static void main(String[] args) {
		Customer c = new Customer(); //기본생성자가 제공된다는 것

	}

}

🌟예제3🌟

//하늘을 날으는 새
class Bird {
	protected String name, color;
	protected boolean wing; //날개의 여부
	
	
	public Bird(String name, String color, boolean wing) {
		super();
		this.name = name;
		this.color = color;
		this.wing = wing;
	}


	public Bird() {
		super();
		// TODO Auto-generated constructor stub
	}


	public void fly() {
		if(wing == true) {
			System.out.println(color + "색 " + name + "이(가) 펄럭~펄럭~");
		} else {
			System.out.println(color + "색 " + name + "이(가) 날 수 없어요.");
		}
	}
}

//비행기
//fly 메소드를 오버라이딩
class Plane extends Bird {
	private boolean engine;

	public Plane(String name, String color, boolean wing, boolean engine) {
		super(name, color, wing);
		this.engine = engine;
	}

	public Plane() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	public void fly() {
		if(wing == true && engine == true) {
			System.out.println(color + "색 " + name + "이(가) 쓩~쓩~, " + "엔진이 있어요 !");
		} else {
			System.out.println(color + "색 " + name + "이(가) 날 수 없고, " + "엔진이(가) 없어요! !");
		}
	}
	
	

}

public class BirdTest {

	public static void main(String[] args) {
		Bird b1 = new Bird("참새", "노랑", true);
		Bird b2 = new Bird("까치", "검은", false);
		b1.fly();
		b2.fly();

		Plane p = new Plane("보잉747", "하늘", true, true);
		p.fly();
		
	}

}

🌞연습문제

👑연습문제1👑

원을 나타내는 Circle 클래스를 상속받아서 피자를 나타내는 Pizza 클래스를 작성해보자.

package practice274;

class Circle {
	protected int radius;

	public Circle(int r) {
		radius = r;
	}

	public Circle() {
		super();
		// TODO Auto-generated constructor stub

	}

}

class Pizza extends Circle {
	private String name;

	public Pizza(String name, int r) {
		super(r);
		this.name = name;
	}

	public void print() {
		System.out.println("피자의 종류:" + name + ", 피자의 크기: " + radius); 
	}

}

public class CircleTest {

	public static void main(String[] args) {
		Pizza obj = new Pizza("Pepperoni", 20);

		obj.print();

	}

}

👑연습문제2👑

동물을 나타내는 Animal 클래스를 상속받아서 새를 나타내는 Bird 클래스를 작성해보자. Bird 클래스안에 포함된 main()을 실행하였을 때 아래와 같은 결과가 출력되도록 하라.

package practice274;


class Animal {
	void walk() {
		System.out.println("걷을 수 있음");
	}
}

class Bird extends Animal {

	public Bird() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	void fly() {
		System.out.println("날을 수 있음");
	}
	
	void sing() {
		System.out.println("노래 부를 수 있음");
	}
}

public class AnimalTest {

	public static void main(String[] args) {
		Bird bird = new Bird();
		bird.walk();
		bird.fly();
		bird.sing();

	}

}

👑연습문제3👑

일반적인 경기를 나타내는 Sports 클래스를 다음과 같이 정의한다. 이 클래스를 상속받아서 축구를 나타내는 클래스 Soccer를 작성하고 getName()과 getPlayer()를 재정의하여서 다음과 같은 출력이 나오도록 하라.

package practice274;

class Sports {

	String getName() {
		return "아직 결정되지 않음";
	}
	int getPlayers() {
		return 0;
	}
	
	
	
}

class Soccer extends Sports {

	String getName() {
		return "축구";
	}
	int getPlayers() {
		return 11;
	}
	
	
}

public class SportTest {

	public static void main(String[] args) {
		Soccer s = new Soccer();
		
		System.out.println("경기이름: " + s.getName());
		System.out.println("경기자수: " + s.getPlayers());

	}

}

👑연습문제4👑

일반적인 사각형을 나타내는 Rectangle 클래스가 다음과 같이 정의된다. 위의 Rectangle 클래스를 상속받아서 색이 있는 사각형을 나타내는 ColorRectangle클래스를 정의한다. ColorRectangle 클래스에는 색상을 나타내는 필드 String color가 추가된다. ColorRectangle 클래스의 생성자를 작성해보자.

package practice274;

class Rectangle {
	int width, height;
	
	public Rectangle(int width, int height) {
		this.width = width;
		this.height = height;
	}

	public Rectangle() {
		super();
		// TODO Auto-generated constructor stub
	}
	
	
}

class ColorRectangle extends Rectangle{
	String color;

	public ColorRectangle() {
		super();
		// TODO Auto-generated constructor stub
	}

	public ColorRectangle(int width, int height, String color) {
		super(width, height);
		this.color = color;
		// TODO Auto-generated constructor stub
	}
	
	
}

public class RectangleTest {

	public static void main(String[] args) {
		ColorRectangle obj = new ColorRectangle(100, 100, "blue");
		
		System.out.println("가로: " + obj.width);
		System.out.println("세로: " + obj.height);
		System.out.println("색상: " + obj.color);
		
	}

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

0개의 댓글

관련 채용 정보