20210924 생성자, 상속

DUUUPPAAN·2021년 9월 24일
0

교육 20210915~ Java

목록 보기
6/13

·복습복습

-어제 배운 것들은 개념적인 것들이 많아서, 많은 시간을 복습에 할애하지는 않았다.

·메소드 오버로딩

-메소드의 이름은 중복이 되면 안될 것 같지만, 다른 기능을 하는 메소드가 같은 이름일 경우도 있었다. (보통은 메소드의 이름을 그렇게 정의하는 경우는 잘 없다고 하셨지만, 그래도 알아야한다고 하셨다.)
메소드 오버로딩은 같은 이름의 메소드를 한 클래스에서 여러 개 정의할 수 있는 기능을 의미한다. 단, 이 때는 조건에 부합해야 하는데, 간단하게 말하자면, 메소드에 있는 파라미터 변수가 달라야 한다.
컴파일러는 같은 이름의 메소드가 있어도, 파라미터로 메소드를 구분하기 때문이다. 단, 여기서 파라미터 변수가 달라야 한다는 것에 주목해야 한다.
파라미터 변수가 달라야 한다는 것은 파라미터 타입이나 개수가 달라야 한다는 것이다.
예를 들어,
void upTemp(int x);
void upTemp(int x, String y);
void upTemp(int x, int y);
위의 세 가지 메소드는 컴파일러가 다르게 인식한다.
그러나
void upTemp(int x);
void upTemp(int y);
위의 두 가지 경우는 파라미터 변수는 정수형이고, 그냥 받는 파라미터 변수의 이름만 다르다. 이런 경우 컴파일러는 해당 메소드를 다르게 인식하지 않는다. 즉, 컴파일 오류가 난다. 동일한 메소드가 두 개인 것! 주의하자!

·생성자

-생성자는 new 연산자에 의해서 객체를 생성할 때 단 한 번 호출되는 단위이다.
그동안 했던 것과 조금 혼동되는 개념이었다.
그동안은 예를 들어,

AirCon airCon = new AirCon();

위처럼 객체를 생성할 때, 빈 생성자를 이용해 객체를 생성해왔다. 사실 이 때, 생성자를 따로 정의해줬어야 한다.

위의 객체 생성에 대응하는 빈 생성자를 정의한다면,

class AirCon{	public AirCon(){}  }

다음과 같이 간단하게라도 정의해줘야 한다.
다만, 지금까지는 클래스에 생성자가 하나도 정의되지 않았기 때문에 컴파일러가 자동으로 빈 생성자를 생성해줬기 때문에 오류가 나지 않았다. 그러나 만약 우리가 인자가 있는 생성자를 하나라도 정의했다면, 빈 생성자는 자동으로 생성되지 않고, 오류가 난다.

class Person{
	int age;
	String name;
	int height;
	int weight;
	
	public Person() {
	}

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



public class ConstructorTest {

	public static void main(String[] args) {
	
	Person person1 = new Person();
	System.out.println(
"person1.name = "+person1.name+", person1.height = "+person1.height+", person1.weight = "+person1.weight+", person1.age = "+person1.age
			);
	
	Person person2 = new Person(30);
	System.out.println(
			"person2.name = "+person2.name+", person2.height = "+person2.height+", person2.weight = "+person2.weight+", person2.age = "+person2.age
						);
	
	Person person3 = new Person("goodman");
	System.out.println(
			"person3.name = "+person3.name+", person3.height = "+person3.height+", person3.weight = "+person3.weight+", person3.age = "+person3.age
						);
	
		
	}

}

위의 코드에서 보면, 총 세개의 객체를 생성했다. 그리고 각각의 객체는 빈 생성자, 정수가 인자로 담긴 생성자, 문자열이 인자로 담긴 생성자를 이용해 생성되었다.
여기서 person2와 3에 해당하는 생성자를 정의하는 것은 잊어버릴 수 없다. 왜냐하면 인자를 보냈기 때문에 받을 곳이 필요하겠구나 생각을 하게 되는데, 문제는 person1의 객체를 만들 때 사용한 빈 생성자도 반드시 정의해줘야 한다. 기존에는 이런 식으로 하지 않았기 때문에 그냥 생략했지만, 지금부터는 써주지 않으면 오류다.

·private getxxx setxxx 상속

-변수를 정의할 때, 접근 제한자라는 private를 사용할 수 있다는 것을 배웠다. 아직 제대로 알려주시지는 않았지만, 캡슐화하여 내용을 보호하는 기능이라고 알려주셨다. 다만 이렇게 접근제한자를 사용한 경우, 직접적으로 사용할 수 없고 getxxx와 setxxx 메소드를 통해 해당 변수에 접근할 수 있다. 문제는 변수 하나당 getxxx와 setxxx의 메소드를 정의해줘야 하기 때문에, 이클립스에서 자동으로 해주는 기능을 사용했다. 굉장히 편리했지만, 교수님께서는 만약 이런 툴이 없을 때는 직접 타이핑해야 하기 때문에 어떻게 쓰는지도 꼭 알아두길 바라셨다.

-오늘 오후 수업은 부모 클래스를 상속하는 코드를 엄청나게 오랫동안 뜯어봤다. 우선 입력부터 굉장히 오래 걸렸고, 중간중간 오류가 나는 학생들도 많아서 해당 학생들의 오류를 잡아주기 위해 시간이 많이 할애되었다. 덕분에 찬찬히 혼자서 뜯어볼 시간은 많았지만, 아직 완전하게 이해가 되는 부분은 아니었기 때문에 주말에 더 자세히 하나하나 뜯어서 살펴보려고 한다.

부모 클래스를 상속 받으려면

public class 자식클래스 extends 부모클래스

위와 같은 형식으로 부모클래스를 상속받는 다는 것을 명시해줘야 한다.
또한 변수들을 초기화하는 명령을 할 때,

public 자식클래스(부모클래스에서 받는 모든 변수들+자식클래스의 변수들){
super(부모클래스에서 받는 변수들);
...
...
}

위와 같이 부모 클래스에서 가져오는 변수들을 명시해줘야 한다.
해당 작업도 이클립스에서 자동으로 해주는 기능이 있었다. 그러나 꼭 직접 써보도록 하자.

부모클래스

package Generate;

public class Person {
	private String name;
	private int age;
	private int height;
	private int weight;
	
	
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}
	public int getHeight() {
		return height;
	}
	public void setHeight(int height) {
		this.height = height;
	}
	public int getWeight() {
		return weight;
	}
	public void setWeight(int weight) {
		this.weight = weight;
	}
	
	//초기화 시키는 명령 generate constructor using field
	public Person(String name, int age, int height, int weight) {
		super();//얘는 부모가 없음
		this.name = name;
		this.age = age;
		this.height = height;
		this.weight = weight;
	}
	
	
	
	
}

자식클래스

package Generate;

public class Student extends Person{
	private String studentID;
	private int grade;
	private double GPA;
	
	
	public String getStudentID() {
		return studentID;
	}
	public void setStudentID(String studentID) {
		this.studentID = studentID;
	}
	public int getGrade() {
		return grade;
	}
	public void setGrade(int grade) {
		this.grade = grade;
	}
	public double getGPA() {
		return GPA;
	}
	public void setGPA(double gPA) {
		GPA = gPA;
	}
	//Person을 상속받을 것임.
	public Student(String name, int age, int height, int weight, String studentID, int grade, double gPA) {
		super(name, age, height, weight);
		this.studentID = studentID;
		this.grade = grade;
		GPA = gPA;
	}
	
	public void show() {
	System.out.println("-------------------------");
	System.out.println("학생이름 : "+getName());
	System.out.println("학생나이 : "+getAge());
	System.out.println("학생키 : "+getHeight());
	System.out.println("학생몸무게 : "+getWeight());
	System.out.println("학번 : "+getStudentID());
	System.out.println("학년 : "+getGrade());
	System.out.println("학점 : "+getGPA());
	}
}

부모클래스에서 name age height weight를 받았음.

메인이 되는 클래스

package Generate;

public class Main {
	
	public static void main(String[] args) {
	//밑의 인자 순서는, Student 파일의 초기화 순서랑 매치시켜야됨.
	Student student1 = new Student("홍길동", 20, 175, 70, "20170101", 1, 4.5);
	student1.show();
	Student student2 = new Student("이순신",30,170,80,"20170105",4,3.0);
	student2.show();
	}
}

전에 했던 것과 크게 다르지 않는데, private와 상속의 개념이 추가되어서 굉장히 헷갈리는 느낌이다. 주말에 더 깊게 복습해야될 것 같다. 개인적으로 직접 처음부터 다른 코드를 작성해보는 것을 목표로 공부하면 될 것 같다.

추가적으로 교재에서 기존의 회원 정보에서
회원 이름 검색을 통해 일치하는 회원 이름이 있으면 해당 회원의 모든 정보를 보여주고, 없다면 다시 입력하라고 해주는 코드를 보았고, 타이핑해서 공부했다.
다만, 수업 끝날 시간에 해서 정확하게 이해를 하지 못했다. 주말에 찬찬히 뜯어보면서 어떤 식으로 구성을 했는지, 그림도 그려가며 이해해보려 노력해야겠다.
오늘도 많이 복습하고 따라서 코드를 작성해봤는데, 시간이 너무 흘러서 제대로 보지 못한 것이 많은 것 같다.

·점점 복잡해지고 어려워지는 코드

-사실 벌써부터 조금 복잡하고 어려워져서 두렵기도 하다. 바로 전날까지만 해도 개념에 대한 것들을 알게 되어서 굉장히 기뻤는데, 하루만에 이렇게 난이도가 상승할 수 있는지... 더 열심히 해야될 것 같다. 다행히 이해가 안되거나 어려운 부분이 많은 날이었는데, 다음날이 바로 주말이어서 복습할 시간이 여유롭고 충분하다. 열심히 주말을 보내자!!!복습복습복습 운동 영어공부!!!

profile
비전공자란 이름으로 새로운 길을 가려 하는 신입

0개의 댓글