클래스 심화 예제)
학생관리 프로그램을 만들어 보자
-학생관리 프로그램은 학생등록. 학생정보번경, 학생정보출력의 기능이 있다.(학생 최대 3명까지 가능)
해당 프로그램을 완성하기 위해 학생클래스와 학생관리 기능을 제공하는 클래스가 존재한다
학생 클래스는 이름. 나이, 학점(A,B.C.), 언락처 정보를 가지고 있다
학생관리 클래스는 학생등록, 학생정보번경(연락처), 학생삭제, 학생정보출릭의 기능이 있다
추가적인 실행클래스(main메소드가 존재하는 클래스)를 만들어서 학생프로그램을 완성해보서요.
아래는 프로그램의 실행예시이다. 아래와 같이 프로그램이 실행될 수 있게 프로그램을 만들어보세요
예시)
학생관리 프로그램을 실행합니다
1)학생등록 2학생정보번경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료 :1
학생 등록을 시작합니다. 학생 정보를 입력하세요.
이름 :홍길동
나이:20
연락처 :010-0000-0000
학점:A
1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료:1
이름 : 장길동
나이:30
연락처 : 010-0000-1111
학점:B
1)학생등록 2)학생정보번경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료 :2
학생의 연락처를 변경합니다.
변경 학생 : 김자바
해당하는 학생이 존재하지 않습니다. 다시 입력하세요
변경 학생:홍길동
연락처 : 010-1111-1111
변경완료되었습니다.
1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료 :3
정보를 열람할 학생 :김자바
해당하는 학생이 존재하지 않습니다. 다시 입력하세요.
정보를 열람할 학생 : 홍길동
요청하신 학생의 정보입니다
이름 : 홍길동, 나이 : 20, 연락처 : 010-0000-0000, 학점:A
1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료 :4
모든 학생의 정보입니다. 현재 총 학생 수는 2명입니다.
이름 : 홍길동, 나이 : 20, 연락처 : 010-0000-0000, 학점:A
이름 : 장길동, 나이 : 30, 연락처 : 010-0000-1111, 학점:B
1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료 :5
프로그램을 종료합니다.
학생들을 저장하는 student클래스)
package stu_manage;
import study.CallByReference;
import java.util.Scanner;
public class Student {
private String name;
private int age;
private String callNumber;
private String grade;
public Student(String name, int age, String callNumber, String grade){
this.name = name;
this.age = age;
this.callNumber = callNumber;
this.grade = grade;
}
//학생의 모든 정보를 출력하는 메소드
//이름 : 장길동, 나이 : 30, 연락처 : 010-0000-0000, 학점 : B
public void printStuInfo(){
System.out.println("이름 : " + name +
", 나이 : " + age +
", 연락처 : " + callNumber +
", 학점 : " + grade);
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getCallNumber() { return callNumber;}
public String getGrade() {
return grade;
}
public void setCallNumber(String callNumber) {
this.callNumber = callNumber;
}
}
기능들을 담은 StudentManage클래스
학생관리 프로그램을 테스트 할 수 있는 StudentTest클래스
package stu_manage;
import java.util.Scanner;
public class StudentTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
//studentTest에 studenManage에 대한 객체 생성
StudentManage sm = new StudentManage();
System.out.println("학생관리 프로그램을 실행합니다.");
Student[] students;
//5번 프로그램종료할 때까지 무한반복 따라서 while
while(true){
System.out.print("1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보 출력 5)프로그램종료 : ");
int opition = sc.nextInt();
//조건이 범위가 아니기 때문에 switch-case문을 쓰는게 적당하다.
switch(opition) {
case 1:
sm.regStudent();
break;
case 2:
sm.setStuInfo();
break;
case 3:
sm.showStuInfo();
break;
case 4:
sm.allShowStuInfo();
break;
case 5:
System.out.println("프로그램 종료");
System.exit(0); //프로그램 종료 코드
}
}
}
}
================================================================================
메소드 오버로딩(method overloading)
메소드(method)가 중복 되더라도 매개변수의 자료형이 다르거나 개수가 다르면 사용가능하다
예제)
public class OverLoading1 {
public static void main(String[] args) {
System.out.println(10);
System.out.println("java");
System.out.println(10.5);
aaa(10);
}
public static void aaa(String str){
System.out.println(str);
}
//메소드가 중복되었지만 매개변수의 자료형이 다르거나 개수가 다르면 사용가능
public static void aaa(int a){
System.out.println(a);
}
}
================================================================================
스태틱(static)의 의미와 활용법
static은 변수 및 메소드에서 사용 가능.
staric이 선언된 변수 및 메소드는 공용을 의미한다.
붙은 변수 및 메소드는 자바 문법상 클래스 안에서 정의가 되지만, 클래스에 속한 건 아니다.
static 변수 및 메소드는 객체가 생성되기 전에 생성된다.
예제)
package study2;
//static은 변수 및 메소드에서 사용 가능.
//staric이 선언된 변수 및 메소드는 공용을 의미한다.
//static이 붙은 변수 및 메소드는 자바 문법상 클래스 안에서 정의가 되지만, 클래스에 속한 건 아니다.
//static 변수 및 메소드는 객체가 생성되기 전에 생성된다.
//static은 공용 변수
//static을 썻을시 각자의 개체에서 num을 공유하는 느낌.
public class CntTest {
public static void main(String[] args) {
//객체 3개 생성
//각자의 객체에 num이라는 변수가 다 따로 존재
Cnt c1 = new Cnt();
Cnt c2 = new Cnt();
Cnt c3 = new Cnt();
}
}
class Cnt{
static int num = 0;
//생성자
public Cnt(){
num++;
System.out.println("객체 생성 " + num);
}
}
================================================================================
상속(inheritance)
정의) A라는 클래스가 B라는 클래스에게 상속 받으면
A라는 클래스는 b클래스에 있는 변수 및 메소드 바로 자기꺼 처럼사용 가능
상속의 문법 : 클래스명 extends 상속 받을 클래스명
상속 받은 클래스에서 정의된 변수 및 메소드를 가지게 된다.
여러 클래스에게 상속이 가능하다.(반대로 하위클래스는 여러 상위클래스 상속은 못받는다)
-예시 Man BusinessMan
부모클래스 자식클래스
수퍼클래스 서브클래스
상위클래스 하위클래스
예제 1)
public class Man {
String name;
//기본 생성자 생성
public Man(){
System.out.println("Man 생성자 호출");
this.name = "";
}
//기본 생성자X
public Man(String name){
this.name = name;
}
public void tellName(){
System.out.println("이름은 : "+name);
}
}
//상속의 문법 : 클래스명 extends 상속 받을 클래스명
//상속 받은 클래스에서 정의된 변수 및 메소드를 가지게 된다.
//여러 클래스에게 상속이 가능하다.
// Man BusinessMan
// 부모클래스 자식클래스
// 수퍼클래스 서브클래스
// 상위클래스 하위클래스
//BusinessMan이 Man이라는 클래스로부터 상속받는 코드
class BusinessMan extends Man{
//기존에 Man에서 상속받은 name라는 변수와 company라는 변수 2개를 가짐
String company;
//멤버변수 company에 매개변수를 받아 생성자 생성
//부모 클래스에 생성자가 기본 생성자가 아닐경우 오류
//기본 생성자가 없을시 부모 클래스에 기본 생성자 생성
//만약 기본 생성자를 사용하고 싶지 않을시 super()안에
//부모 클래스 생성자에 해당하는 매개변수 정보와 동일한 값을 넣는다.
public BusinessMan(){
//super() : 부모클래스의 !기본! 생성자 호출. 기본적으로 해당코드가 숨어있다
super();
System.out.println("BusinessMan 생성자 호출");
this.company = "";
//상속받은 클래스에서 변수를 초기화 할수있지만 부모클래스에 있는 변수는
//부모클래스에서 초기화 하는 것이 좋다.
name = "";
}
//제 직장을 출력하는 메소드
public void tellInfo(){
System.out.println("제 직장은 "+company);
}
}
public class ManTest {
public static void main(String[] args) {
BusinessMan m1 = new BusinessMan();
m1.name = "홍길동";
System.out.println(m1.name);
m1.tellName();
m1.tellInfo();
}
}
public class ManTest2 {
public static void main(String[] args) {
//상속 관계에서 생성자를 호출하면
//생성자의 가장 첫 줄에 숨어 있는 super()가 실행 됨.
//super()는 부모 클래스의 기본 생성자를 호출.
//그래서 부모클래스에 기본 생성자가 없다면
//자식 클래스의 생성자에서 오류가 발생.
//이런 오류를 해결하기 위해선
//1. 부모 클래스에 무조건 기본 생성자를 정의해주거나,
//2. super()의 매개변수 정보를
//부모 클래스의 생성자 매개변수 정보와 동일하게
//호출을 해줘야 함.
BusinessMan m1 = new BusinessMan();
}
}
예제 2)
public class SubCls extends SuperCls {
// 자동으로 만들어지는 생성자
// public SubCls(){
// super();
// }
//SubCls 기본 생성자 생성
public SubCls(){
System.out.println("서브 생성자1");
}
public SubCls(int a){
//super에 매개변수 2개가 있기때문에 부모 클래스에서 매개변수 2개를 받는 생성자가 실행
super(5,3);
System.out.println("서브 생성자2");
}
}
public class SuperCls {
public SuperCls(){
System.out.println("생성자1");
}
public SuperCls(int i){
System.out.println("생성자2");
}
public SuperCls(int i, int j){
System.out.println("생성자3");
}
}
public class SuperSubTest {
public static void main(String[] args) {
//SubCls 기본 생성자를 실행하고 부모 클래스의 기본 생성자를 실행
SubCls c1 = new SubCls(); //
System.out.println();
//SuperCls클래스에 매개변수 정수 1개를 갖는 생성자를 실행
SuperCls c2 = new SuperCls(5);
System.out.println();
//SubCls가 부모 클래스가 있기 때문에 부모 클래스 기본 생성자를 실행하고
//SubCls클래스에 매개변수 정수 한개를 받는 생성자를 실행한다.
SubCls c3 = new SubCls(3);
System.out.println();
}
}
예제3)
//자바는 다중 상속을 지원하지 않습니다.
//하지만 다중 상속을 한 것처럼 클래스를 구현 할 수 있다.
public class Aaa {
int a;
//상속을 준다고 하여도 private 변수는 하위 클래스에선 접근 불가
private int aaa;
//protected : private + 하위(자식)클래스까지 사용 허용
protected int a1;
}
class Bbb extends Aaa{
int b;
public void bbb(){
a = 10;
//private으로 선언된 변수이기 때문에 사용 불가.
//aaa=10;
a1 = 10;
}
}
//Ccc클래스의 부모 클래스 Bbb클래스에도 부모 클래스 Aaa클래스가 있기 떄문에
//Ccc클래스에서 최상위 부모클래스 Aaa클래스의 내용을 가진다.
class Ccc extends Bbb{
int c;
}
'코딩 > JAVA' 카테고리의 다른 글
23.02.02 String, interface (2) | 2023.02.02 |
---|---|
23.02.01 상속, Object클래스, toString클래스 (0) | 2023.02.01 |
23.01.30 (class, 접근제한자) (0) | 2023.01.30 |
23.01.27 (method, class) (0) | 2023.01.29 |
23.01.26 (method) (2) | 2023.01.29 |
댓글