영화_시리즈 영화 상속 실습2

호떡·2022년 7월 26일
0

📝관련 실습: 상속과 다형성 (SeriesMovie.java)

  • 상속_매개변수 있는 부모 생성자
  • StringBuilder

public class SeriesMovie extends Movie {
	//필드
	private int seriesNum;		// 해당 시리즈 영화가 시리즈 중 몇번째 인지
	private String episode;		// 해당 시리즈 영화의 부제목
	
	//생성자
	public SeriesMovie() {
	}

	public SeriesMovie(int id, String title, String director, String genre,
    					int runningTime, int seriesNum, String episode) 
   {
		super(id, title, director, genre, runningTime);
		this.seriesNum = seriesNum;
		this.episode = episode;
	}

	//Getter & Setter
	public int getSeriesNum() {
		return seriesNum;
	}

	public void setSeriesNum(int seriesNum) {
		this.seriesNum = seriesNum;
	}

	public String getEpisode() {
		return episode;
	}

	public void setEpisode(String episode) {
		this.episode = episode;
	}


	@Override
	public String toString() {
		StringBuilder sb = new StringBuilder(super.toString());
		sb.append(" [시리즈 번호= " + this.seriesNum);
		sb.append(", 시리즈 부제목= " + this.episode+"]");
		return sb.toString();
	}
	
//	@Override
//	public String toString() {
//		return "SeriesMovie [id= " + super.getId() + ", title= " + super.getTitle() + ", director= 
//		"+ super.getDirector() + ", genre= " + super.getGenre() + ", runningTime= " + 
//		super.getRunningTime() + ", seriesNum= " + seriesNum + ", episode= " + episode + "]";
//	}

}//main


매개 변수 있는 부모 생성자

현실에서 부모 없는 자식이 있을 수 없듯이 자바에서도 자식 객체를 생성하면, 부모 객체가 먼저 생성되고 자식 객체가 그 다음에 생성된다. 모든 객체는 클래스의 생성자를 호출해야만 생성된다. 이는 부모 객체도 예외는 아니다. 그렇다면 부모 객체를 생성하기 위해 부모 생성자를 어디서 호출한 것일까? 이것에 대한 비밀은 자식 생성자에 숨어 있다. 부모 생성자는 자식 생성자의 맨 첫 줄에서 호출된다. 생성자가 명시적으로 선언되지 않았다면 컴파일러는 기본 생성자를 생성해 낸다. (반면... 링크텍스트) 이 때 super() 이것은 부모의 기본 생성자를 호출한다.

부모 클래스의 매개 변수가 있는 생성자가 필요하다면 자식 생성자에서 반드시 부모 생성자 호출을 위해 super(매개값, ...) 을 명시적으로 호출해줘야 한다. 그렇지 않는다면 기본 생성자가 호출될 것이다.
💡다만 이것도 기본 생성자와 매개변수 있는 생성자가 함께 있을 때 발생하는 일이다. 링크텍스트


StringBuilder

자바에서 문자열하면 String 을 대개 많이 떠올리고 사용한다. 그런데 이 문자열이 1개 이상 있어서 이것들을 더해야 한다고 하면 어떤 방법을 쓸 수 있을까? 이 String 객체끼리 더하는 방법은 메모리 할당과 해제를 발생시키는데, 덧셈 연산이 많아진다면 성능적으로 좋지 않다.

많은 문자열을 연결하면 많은 중간 문자열 객체가 생성되어 비효율적인 코드가 생성된다.

왜 이런 말을 하는 것일까?
자바에서 String 객체는 변경 불가능하다. 한 번 생성되면 내용을 바꿀 수 없단 뜻이다. 따라서 하나의 문자열을 다룬 문자열과 연결하면 새 문자열이 생성되고, 이전 문자열은 가비지 컬렉터로 들어간다.

문자열끼리 연결하는 작업 시에는 내부적으로 여러 작업이 발생하고, 기존 문자열 값의 길이에 추가된 문자열의 크기를 더한 크기의 새로운 문자열이 생성된다. 이걸 100만번 수행하게 되면 메모리를 많이 잡아먹게 되는 건 당연한 일 같다.

String은 변경 불가능한 문자열을 생성하지만 StringBuilder는 변경 가능한 문자열을 만들어 주기 때문에, String을 합치는 작업 시 하나의 대안이 될 수 있다.

StringBuilder는 String과 문자열을 더할 때 새로운 객체를 생성하는 것이 아니라 기존의 데이터에 더하는 방식을 사용하기 때문에 속도도 빠르며 상대적으로 부하가 적다. 따라서 긴 문자열을 더하는 상황이 발생할 경우 StringBuilder를 적극적으로 사용하면 되겠다.

사용법은 먼저 StringBuilder의 객체를 생성한 후, append()의 인자로 연결하고자 하는 문자열을 넣어서 StringBuilder의 객체를 통해 호출한다. 그리고 출력 시에는 toString()을 붙여야 하고, String 변수에 넣을 때도 마찬가지다.

0개의 댓글