본문 바로가기

개발일지/Java + Spring

[Java] 0924 클래스의 구조 / 상위 클래스를 상속 받은 클래스

Main은 public static void main(String[] args) { } 있지만, class에서는 main을 안쓴다. 잘 사용하진 않지만 하나로 합친다면 public은 메인에 하나만 사용하고, 메인 이름이 파일명이 된다. 여러 개로 나누어서 사용하는 게 기본이다. 

-클래스의 구조-
변수 선언 (멤버변수-모든 지역에서 사용 가능하다)
메소드 (인쇄 행위 , 계산 행위)
메소드 안에서도 변수 선언을 할 수 있음 (로컬-지역 변수는 여기서만 사용할 수 있다.)

main에서는 가져다 씀 - 모든 루틴을 메인에서 사용함
클래스에서 설정을 해줘도 메인에서 인쇄를 해야 볼 수 있다.
그냥 사용하는 것이 아니라 반드시 객체 생성(new)을 해줘야 한다.
--------------
멤버 변수 - 초기화 하지 않아도 자동 초기화 됨 
로컬 변수 - 수동으로 초기화를 꼭 해줘야함 
--------------
메소드
반환할 데이터 타입을 쓴다. int add(10, 10)
반환하지 않는 경우 void를 붙임 void onPower();
--------------
인자와 파라미터는 데이터타입과 개수가 같아야한다. 
--------------

package AirCon;

public class VariableArgument {
	
	void printInfo(String ...infos) {
		if(infos.length != 0) {
			for(int i=0; i<infos.length; i++) {
				System.out.println(infos[i]);
			}
		}else{
			System.out.println("인자가 없네요");
		}
		System.out.println("-------------------------");
	}
	
	/*void printInfo(){
		System.out.println("인자가 없어요");
	}
	void printInfo(String name){ //파라미터 데이터 타입 같아야 됨
		System.out.println(name); 
	}
	void printInfo(String name, String m1){ //파라미터 개수가 같아야 됨
		System.out.println(name + " " + m1);
	}
	void printInfo(String name, String m1, String m2){ 
		System.out.println(name + " " + m1 + " " + m2);
	}
	//같은 이름을 이용해서 인자값이 맞는 걸 연결해줌 : 오버라이딩
	//실전에서는 이렇게 더 많이 사용한다. 
*/	
	
	public static void main(String[] args) {
		VariableArgument vt = new VariableArgument();
		
		System.out.println("인자가 없을 때 : ");
		vt.printInfo();
		
		System.out.println("인자가 한 개일 때 : ");
		vt.printInfo("오정원"); //인자
		
		System.out.println("인자가 두 개일 때 : ");
		vt.printInfo("오정원", "전산부");
		
		System.out.println("인자가 세 개일 때 : ");
		vt.printInfo("오정원", "전산부", "1억");
	}

}

(두 가지 버전)

class Person{
	int age;
	String name;
	int height;
	int width;
	
//	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.width = " + person1.width +
				", person1.age = " + person1.age);
		
//		Person person2 = new Person(30);
//		System.out.println(
//				"person2.name = "+ person2.name +
//				", person2.height = " + person2.height +
//				", person2.width = " + person2.width +
//				", person2.age = " + person2.age);
		
		person1.age = 30;
		System.out.println(
				"person1.name = "+ person1.name +
				", person1.height = " + person1.height +
				", person1.width = " + person1.width +
				", person1.age = " + person1.age);
			
//		Person person3 = new Person("goodman");
//		System.out.println(
//				"person3.name = "+ person3.name +
//				", person3.height = " + person3.height +
//				", person3.width = " + person3.width +
//				", person3.age = " + person3.age);
		
		person1.name = "goodmen";
		System.out.println(
				"person1.name = "+ person1.name +
				", person1.height = " + person1.height +
				", person1.width = " + person1.width +
				", person1.age = " + person1.age);
	}

}
//이렇게 바꿔도 결과는 똑같다.

클래스가 한 파일 안에 여러 개 있을 때 public class이 붙으면 파일 제목이 된다.

Person person1 = new Person();
=> 메인에서 Person 클래스를 사용하고 싶어서 (변수가 4개 메소드가 3개) 객체를 생성했다.

인쇄된 내용을 보면...
person1.name = null, person1.height = 0, person1.width = 0, person1.age = 0
==> 아무것도 없으면 초기화 값이 출력됨 

person2.name = null, person2.height = 0, person2.width = 0, person2.age = 30
==> 30이라는 값을 주면 int 값을 받은 
public Person(int age) { this.age = age; } 메소드에 매칭이 된다.
this.age이것은  다른 값이다. 

person3.name = goodman, person3.height = 0, person3.width = 0, person3.age = 0
==>goodman을 주면 name에 매칭이 된다. 


부모 클래스

package Generate;

public class Person {
	private String name; //아무도 못 가져가게 private 붙임
	private int age;
	private int height;
	private int weight;
	
	//get 접근, set 삽입
    //이게 있어야 꺼내쓸 수 있음
	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;
	}
	
	//초기화 작업
	public Person(String name, int age, int height, int weight) {
		super();
		this.name = name;
		this.age = age;
		this.height = height;
		this.weight = weight;
	}
	
}

 

쉽게 get, set 메소드 생성하는 방법

alt + Shift +S / Generate Getters and Setters / 모두 체크 및 확인 

 

쉽게 초기화 작업하는 방법

alt + Shift +S / Generate Constructor using Fields / 모두 체크 및 확인 

 

 

자식클래스(Student)

package Generate;

public class Student extends Person{ //extends Person 퍼슨에게 상속 받다.
	private String studentID;
	private int grade;
	private double GPA; //학점
	
	//get, set
	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;
	}
	public Student(String name, int age, int height, int weight, String studentID, int grade, double gPA) {
		super(name, age, height, weight); //person에서 4개 상속 받음
		this.studentID = studentID;
		this.grade = grade;
		GPA = gPA;
	}
	
	//위에서 상속 받은 걸 아래처럼 사용한다.
	//만들어만 놓고 부르지 않음 
	//활용하려면 Main 만들어야한다.
	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());
	}
	
}

 

자식 클래스(Teacher)

package Generate;

public class Teacher extends Person {
	private String teacherID;
	private int monthSalary;
	private int workedYear;
	
	//캡슐화 된 것을 아무도 볼 수 없으면 소용이 없으니 바깥에서 사용할 수 있는 통로를 만든다.
	//get, set 
	public String getTeacherID() {
		return teacherID;
	}
	public void setTeacherID(String teacherID) {
		this.teacherID = teacherID;
	}
	public int getMonthSalary() {
		return monthSalary;
	}
	public void setMonthSalary(int monthSalary) {
		this.monthSalary = monthSalary;
	}
	public int getWorkedYear() {
		return workedYear;
	}
	public void setWorkedYear(int workedYear) {
		this.workedYear = workedYear;
	}
	
	//초기화
	public Teacher(String name, int age, int height, int weight, String teacherID, int monthSalary, int workedYear) {
		super(name, age, height, weight); //person에서 상속을 받아 갖고 옴
		this.teacherID = teacherID;
		this.monthSalary = monthSalary;
		this.workedYear = workedYear;
	} 
	
	//초기화 했으니 인쇄도 해야 됨
	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("교직원번호 : " + getTeacherID());
		System.out.println("교사 월급 : " + getMonthSalary());
		System.out.println("교사 년차 : " + getWorkedYear());
	}
	
}

 

Main

package Generate;

public class Main {

	public static void main(String[] args) {
		Student student1 = new Student("홍길동", 20, 175, 70, "20170101", 1, 4.5);
		Student student2 = new Student("이순신", 30, 170, 80, "20170105", 4, 3.0);
		student1.show();
		student2.show();
		//student 클래스 안 show 메소드 출력
		
	}

}

 

출력

----------------------
학생 이름 : 홍길동
학생 나이 : 20
학생 키 : 175
학생 몸무게 : 70
학번 : 20170101
학년 : 1
학점 : 4.5
----------------------
학생 이름 : 이순신
학생 나이 : 30
학생 키 : 170
학생 몸무게 : 80
학번 : 20170105
학년 : 4
학점 : 3.0
----------------------
교사 이름 : Tome sone
교사 나이 : 25
교사 키 : 180
교사 몸무게 : 120
교직원번호 : ABC201
교사 월급 : 3600000
교사 년차 : 5
----------------------
교사 이름 : How sone
교사 나이 : 25
교사 키 : 180
교사 몸무게 : 120
교직원번호 : ABC201
교사 월급 : 4000000
교사 년차 : 7

 

package Generate;

public class MAIN2 {

	public static void main(String[] args) {
		Student[] students = new Student[100];
		for(int i=0; i<100; i++) {
			students[i] = new Student("홍길동", 20, 175, 70, i+"", 1, 4.5);
			//앞students : 여기서 만든 클래스 객체 이름, 뒤Student: 클래스 이름
			students[i].show();
		}
	}

}

 

보통은 이렇게 사용하진 않지만 해봄

 

 

입력 받아서 출력하고 싶을 땐?

package Generate;

import java.util.Scanner;

public class MAIN2 {

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.print("몇 명을 입력 하실 건가요?");
		int num = sc.nextInt();
		Student[] students = new Student[num]; //여러명이라서 테이블로 선언
		
		
		System.out.println("순서대로 이름/나이/키/몸무게/학번/학년/학점 입력 : ");
		
		for(int i=0; i<num; i++) {
			String name1; int age1; int height1; int weight1; 
			String studentID1; int grade1; double gPa11;
			
			System.out.print("학생이름은?");
			name1 = sc.next();
			System.out.print("학생나이는?");
			age1 = sc.nextInt();
			System.out.print("학생 키는?");
			height1 = sc.nextInt();
			System.out.print("학생 몸무게는?");
			weight1 = sc.nextInt();
			System.out.print("학생 학번은?");
			studentID1 = sc.next();
			System.out.print("학생 학년은?");
			grade1 = sc.nextInt();
			System.out.print("학생 학점은?");
			gPa11 = sc.nextDouble();
			students[i] = new Student(name1, age1, height1, weight1, studentID1, grade1, gPa11);			
		}
		for(int i=0; i<num; i++) {
			students[i].show();
		}
	}

}