Backend/JAVA

JAVA 코딩 객체지향프로그래밍 OOP, Class 중첩클래스 - 일반중첩클래스, static중첩클래스, 지역중첩클래스, 익명중첩클래스

쏠솔랄라 2023. 2. 21. 14:27

 

 

JAVA 객체지향 프로그래밍 OOP, Class 기본개념 및 예제

https://developernew.tistory.com/21

 

JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, 함수, 메소드

객체 지향 프로그래밍(OOP: Object Oriented Programming) 객체 중심의 프로그래밍 방식 객체끼리의 상호 작용을 통하여 프로그램을 작성하는 방식 부품화 캡슐화 == 클래스 속성과 기능을 하나의 캡슐처

developernew.tistory.com

 

 

JAVA 객체지향 프로그래밍 OOP, Class, Static

https://developernew.tistory.com/22

 

JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, static

자바 클래스 기본개념 및 기본예제 https://developernew.tistory.com/21 JAVA 코딩 객체지향프로그래밍 OOP, 클래스 Class, 함수, 메소드 객체 지향 프로그래밍(OOP: Object Oriented Programming) 객체 중심의 프로그래

developernew.tistory.com

 

 


 

 

중첩클래스

 

: 클래스 안에 만들어지는 클래스


종류
1. 일반중첩클래스 *
2. static 중첩클래스 *** ; 일반중첩클래스에서 static을 붙이면 static 클래스
---------------------클래스 안의 클래스
3. 지역중첩클래스 ; 메소드 안에 만들어지는 클래스
4. 익명중첩클래스 ************** (중요) ; 클래스의 재정의

 

 

일반중첩클래스, static중첩클래스

 

1. 일반중첩클래스
2. static 중첩클래스


클래스 안에 만들어지는 멤버 클래스
클래스 안에서는 필요하지만 외부에서 단독적으로 쓰임이 없는 것을 관리하기 위해서 만든다

 

public class Suit {

int price;

 

Top t = new Top();

Bottom b = new Bottom();

 

// static 중첩클래스

static class Top{

int price;

}

 

// 일반중첩클래스

private class Bottom{

int price;

}

}

 

 

지역중첩클래스

 

: 매소드 안에서 사용되는 클래스

임시적으로 데이터들을 관리하기 위해서 만들어진다
데이터 관리할 때 사용

- getter, setter, 생성자 등은 잘 만들어 쓰지 않음
- 멤버변수만 만들어 데이터를 묶어 관리

 

public class Main {

public static void main(String[] args) {

class Info{

String name;

int age;

}

 

Info in = new Info();

 

in.name = "홍길동";

in.age = 20;

 

}

}

 

 

익명중첩클래스

 

: 객체 상황에 맞게 클래스를 재정의 하는 구문

현재 사용할 객체의 상황 상 맞지 않는 부분을 수정하거나
필요한 내용을 추가하는 구문 ; 일회성

추상클래스, 인터페이스의 객체를 생성할 때 사용하기도 한다**

 

오버라이드
: 메소드의 재정의
메소드의 형태는 같게 하고 내용을 재정의하는 구문

 

// Main class

public class Main {

public static void main(String[] args) {

 

Key enter = new Key() {

public void push() {

System.out.println("실행");

}

};

 

enter.push();

 

 

Key esc = new Key() {

public void push() {

exit();

System.out.println("종료!");

}

 

public void exit() {

System.out.println("프로그램이 종료됩니다");

System.exit(0); // 프로그램 종료 메소드 ; 0은 정상 종료, 0이 아닌 수는 비정상 종료

}

};

 

// esc.exit(); 추가된 메소드는 외부에서 사용 불가

// 추가시킨 메소드는 익명중첩클래스 내부에서 사용하려고 만든다

 

esc.push(); //임시로 Key가 아니라 Main 내의 메소드를 가리키게 된다

// * 바인딩

 

}

 

// Key class

 

public class Key {

public void push() { // 이 부분에 Main의

System.out.println("구현할 내용이 없다");

}

 

 

 

static final ; 심볼릭 상수 ; 상수화 변화

 

: 변수공간의 데이터를 변경할 수 없는 변수

- 프로그램이 실행하면서 공간이 만들어지고 프로그램이 끝날 때 공간이 소멸된다
- 프로그램 전체적으로 사용되고

   그 값이 변경되지 않고 프로그램에서 의미를 가지고 있는 데이터를 저장하여

   보다 쉽게 구분하여 사용하기 위해서 
- 변수명은 대문자를 권장한다

 

// Key class

public class Key {

// 상수화 변수 설정

public static final String SKILL1;

public static final String SKILL2 = "w";

public static final String SKILL3 = "e";

public static final String SKILL4 = "r";

// 프로그램 실행할 때 공간이 만들어짐 + final 설정으로 인해 한 번 생성되면 바뀌지 않는다

// 초기화를 진행하지 않으면 에러남

 

static { // static 필드 : 프로그램이 실행될 때 이 안에 있는 코드를 먼저 실행한다

SKILL1 = "q";

}

// 이 방식으로 초기화할 경우 main 에서 에러남

 

public void disp() {

System.out.println(SKILL1);

}

 

// 이 방식으로 초기화시키는 경우 CLASS 내부에서만 사용 가능

// 클래스 외부인 Main에서 에러

 

}

 

 

// Main class

import java.util.Scanner;

public class Main {

 

public static void main (String[] args) {

Scanner sc = new Scanner(System.in);

System.out.print("키 입력 : ");

String key = sc.next();

 

// q w e r

 

switch(key) {

case Key.SKILL1:

System.out.println("SKILL1");

break;

case Key.SKILL2:

System.out.println("SKILL2");

break;

case Key.SKILL3:

System.out.println("SKILL3");

break;

case Key.SKILL4:

System.out.println("SKILL4");

break;

default:

System.out.println("잘못된 키 입력");

}

 

}

-> 이 경우 메인화면은 에러남

 

// 올바른 초기화를 진행한 경우

public static final String SKILL1 = "q";

public static final String SKILL2 = "w";

public static final String SKILL3 = "e";

public static final String SKILL4 = "r";

public void disp() {

System.out.println(SKILL1);

}

 

 

출력화면

 

 


 

 

Exercise 1

 

[Student class]
한 학생의 성적을 관리하는 클래스
이름, 알고리즘, 인공지능, 이산수학, 총점, 평균

[Class class]
한 반을 관리하는 클래스
최대 10명까지만 관리하는 클래스

알고리즘_총계, 인공지능_총계, 이산수학_총계
총점_총계, 평균_총계, 학생수_카운트

 

// Student class

// 한 학생의 성적 관리

 

public class Student {

private String name;

private int ag,ai,dm,tot;

private double avg;

 

 

// 생성자

 

public Student(String name,int ag,int ai,int dm) {

this.name = name;

this.setAg(ag);

this.setAi(ai);

this.setDm(dm);

Class.addSu();

}

 

 

// setter

 

public void setName(String name) {

this.name = name;

}

 

public void setAg(int ag) {

if(ag < 0 || ag > 100) {

System.out.println("잘못된 점수 입력!");

return;

}

this.ag = ag;

setTot();

setAvg();

}

 

public void setAi(int ai) {

if(ai < 0 || ai > 100) {

System.out.println("잘못된 점수 입력!");

return;

}

this.ai = ai;

setTot();

setAvg();

}

 

public void setDm(int dm) {

if(dm < 0 || dm > 100) {

System.out.println("잘못된 점수 입력!");

return;

}

this.dm = dm;

setTot();

setAvg();

}

 

private void setTot() {

this.tot = ai + ag + dm;

}

 

private void setAvg() {

this.avg = tot / 3.0;

}

 

 

// getter

 

public String getName() {

return name;

}

 

public int getAg() {

return ag;

}

 

public int getAi() {

return ai;

}

 

public int getDm() {

return dm;

}

 

public int getTot() {

return tot;

}

 

public double getAvg() {

return avg;

}

 

 

// user method

 

public void showData() {

String print = String.format("%-8s %-10d %-10d %-10d %-6d %-10.4f\n", name,ag,ai,dm,tot,avg);

System.out.println(print);

}

 

}

 

// Class class

 

public class Class {

private Student[] arr = new Student[10];

private int agt,ait,dmt,tott;

private static int su;

private double avgt;

 

 

public static void addSu() {

Class.su++;

}

 

public int getSu() {

return su;

}

 

public void stuDisp() {

for(int i = 0; i < su; i++) {

arr[i].showData();

}

}

 

public void showTotal() {

 

System.out.println(String.format("%-8s %-10s %-10s %-10s %-6s %-10s\n", "이름","알고리즘","인공지능","이산수학","총점","평균"));

this.stuDisp();

System.out.println("========================================================");

String print = String.format("%-8s %-10d %-10d %-10d %-6d %-10.4f\n", "총계",agt,ait,dmt,tott,avgt);

System.out.println(print);

}

 

public void addStudent(Student st) {

arr[su - 1] = st;

agt+=st.getAg();

ait+= st.getAi();

dmt += st.getDm();

tott += st.getTot();

setAvgt();

}

 

private void setAvgt() {

avgt = tott / (double)su / 3.0;

}

}

 

// Main class

import java.util.Scanner;

public class Main {

public static void main(String[] args) {

 

Scanner sc = new Scanner(System.in);

Class c = new Class();

 

while(true) {

System.out.print("메뉴 입력\n1.학생 추가 2.학생 보기3.종료\n입력 : ");

int select = sc.nextInt();

 

switch(select) {

case 1:

if(c.getSu() == 10) {

System.out.println("정보를 추가할수 없습니다.");

break;

}

System.out.print("이름 입력 : ");

String name = sc.next();

System.out.print("알고리즘 점수 입력 : ");

int ag = sc.nextInt();

System.out.print("인공지능 점수 입력 : ");

int ai = sc.nextInt();

System.out.print("이산수학 점수 입력 : ");

int dm = sc.nextInt();

Student st = new Student(name, ag, ai, dm);

c.addStudent(st);

break;

case 2:

c.showTotal();

break;

case 3:

System.out.println("프로그램이 종료 됩니다.");

sc.close();

System.exit(0);

default:

System.out.println("잘못된 입력!");

}

}

 

}

 

}