14일차 복습 study
package main;
public class MainClass {
public static void main(String[] args) {
/*
객체지향 3대 요소
1->2-> 3-> 4-> 5
절차지향 -> 순서지향 = 첫번째 작업 진행 후 두번째 작업 실행
객체지향이란 -> 객체를 중시하여 처리를 중심으로 진행
-> 1,2,3,4,5
3대요소
은닉성 , 상속성 , 다형성
캡슐화
멤버 변수 +멤버함수 -> 전부 Class 안에서 캡슐식 (묶어주는 것 )
은닉성
현재 클래스의 외부로부터 접근을 제어하는 것
getter,setter
Constructor : 생성자 -> 초기값
->초기값을 설정 / 초기화와는 다름, 다시 호출할 수 있다
MyClass mycls1 = new MyClass();
// int number = 0;
MyClass mycls2 = new MyClass("홍길동", 1001);
🏛️ 테마 1: 상속과 다형성 (부모-자식 설계도)
상속성
부모 클래스에서 상속 (variable, method)을 받는 것을 의미
over ride -> 상속받은 메소드를 고쳐 기입하는 것
① 상속 (extends)
|
다형성
부모클래스의 instance(객체)를 사용해서 자식 클래스의 객체를 생성하는 것
Parent par = new Child();
Animal dog = new Dog();
Animal cat = new Cat();
Animal cow = new Cow();
why? 자식 클래스의 다양한 객체를 하나의 객체형으로 관리하기 위함
dog.method() -> 자식 클래스에서 over ride 된 메소드가 호출
Dog d = (Dog)dog;
d.func() -> 자식 클래스에만 있는 메소드
어떤 객체인지 확인할 수 있는 키워드 -> instanceof
why? -> 다양한 객체를 하나의 객체형으로 관리하기 위함
Object dog = new Dog();
Object cat = new Cat();
Object cow = new Cow();
② 다형성 (Parent p = new Child();)
|
*/
}
}
class MyClass{
String name;
int number;
public MyClass() {
name = "";
number = 0;
}
public MyClass(String name, int number) {
this.name = name;
this.number = number;
}
void method() {
}
}
class Human{
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void info() {
}
}
class Parent{
private int num;
protected String name;
public Parent() {
}
public Parent(int num) {
super();
this.num = num;
}
public void par_method() {
}
public void method() {
}
}
class Child extends Parent{
public Child() {
//super();
super(1);
}
public void func() {
name = "임소리";
par_method();
super.method();
this.method();
}
public void method() { // <- Over Ride
}
}
Sample 44
Sample 44-MainClass
package mian;
import cls.AbstractClass;
public class MainClass {
public static void main(String[] args) {
/*
abstract class : 추상 클래스
추상 메소드를 하나이상 보유하고 있는 클래스
abstract method : 추상함수
내용(처리)는 없고 사양(proto type)만 선언되어 있는 함수
🏗️ 테마 2: 추상 클래스 (abstract class)
|
일반 메소드 형식
public void method(int i, String str) {
처리
추상 메소드 형식
public abstract void method(int i, String str);
(빈통을 딱 주고 나서 채우는 건 당신이 알아서 해_
코드 특징:
|
*/
//추상 클래스는 아래 형식 처럼 바로 생성하는 것이 불가
//AbstractClass ac = new AbstractClass();
//1.상속 후 추상 메소드를 정의한 클래스를 생성한다
// MyClass mycls = new MyClass();
// mycls.abstractmethod();
// mycls.method();
// //2. instance 는 부모 클래스의 instancefh 로 생성이 가능하다
// AbstractClass ac = new Myclass();
// ac.abstractmethod();
// ac.method();
//
// 3. 생성과 동시에 정의하면 사용이 가능
// Android
AbstractClass ac = new AbstractClass() {
@Override
public void abstractMethod() {
System.out.println("AbstractClass abstractMethod()");
}
};
ac.abstractMethod();
ac.method();
}
}
Sample - MyClass
package cls;
public class MyClass extends AbstractClass {
// MyClass 밑에 에러 떴을 때 소스 -> 오버라이드 들어가서 생성하기
//재정의 하는 과정
@Override
public void abstractMethod() {
System.out.println("MyClass abstractMethod()");
}
}
Sample 44 -AbstractClass
package cls;
public abstract class AbstractClass {
private String name;
public abstract void abstractMethod();
public void method() {
System.out.println("AbstractClass method()");
}
}
Sample 44 -출력결과
AbstractClass abstractMethod()
AbstractClass method()
Sample 45
Sample 45-MainClass
| package main; import cls.Circle; import cls.Rectangle; import cls.Shape; public class MainClass { public static void main(String[] args) { // 원의 넓이 Shape circle = new Circle(3); circle.display(); System.out.println(circle.getArea()); Shape rect = new Rectangle(4, 6); rect.display(); System.out.println(rect.getArea()); } } |
Sample 45-Shape
|
package cls;
//추상 클래스는 클래스 앞에 항상 abstract 붙이기 public abstract class Shape { public abstract double getArea(); public void display() { System.out.println(" 도형의 넓이 구한다 "); } } |
Sample 45-
\Circle
|
package cls;
public class Circle extends Shape { private double radius; public Circle(double radius) { super(); this.radius = radius; } //유징으로 생성자 만들기 @Override public double getArea() { return radius * radius * Math.PI; } @Override // 오버라이딩 겟 에리어만 public void display() { System.out.println("원의 넓이입니다"); } } |
Sample 45-Rectangle
package cls;
public class Rectangle extends Shape {
private double width, height;
public Rectangle(double width, double height) {
super();
this.width = width;
this.height = height;
}
@Override
public double getArea() {
return width * height;
}
@Override
public void display() {
System.out.println("사각형의 넓이입니다");
}
}
Sample 45-Shape
package cls;
//추상 클래스는 클래스 앞에 항상 abstract 붙이기
public abstract class Shape {
public abstract double getArea();
public void display() {
System.out.println(" 도형의 넓이 구한다 ");
}
}
Sample 45-출력결과
AbstractClass abstractMethod()
AbstractClass method()
Sample 46
Sample 46-MainClass
package main;
import cls.HeClass;
import cls.MyClass;
import inter.Myinterface;
public class MainClass {
public static void main(String[] args) {
/*
abstract class
abstract method + method + variable
(추상 메소드) (일반메소드) (멤버변수)
다중상속 불가능
interface
abstract method 로만 구성되어 있다 = 완전 빈통
다중 상속 가능
클래스 구현의 설계 또는 구성을 할 때 사용한다
확장성에 우수하다
🕸️ 테마 3: 인터페이스 (interface)화면 아래쪽의 HeClass, MyInterface 부분이 이 내용이에요! 추상 클래스보다 한 단계 더 나아간 녀석입니다.
|
*/
// interface 만으로 생성이 안됨
// MyInterface mi = new MyInterface();
코드 특징:
|
/*
MyClass my = new MyClass();
my.abMethod();
MyInterface myi = new MyClass();
myi.abMethod();
MyInterface myinter = new MyInterface() {
@Override
public void abMethod() {
System.out.println("MyInterface abMethod()");
}
};
myinter.abMethod();
*/
HeClass he = new HeClass();
he.abMethod();
he.youfunc();
Myinterface myi = new HeClass();
myi.abMethod();
}
}
/*상속 클래스
class Father {
}
class Mother{
}
// Java 는 다중 상속이 불가하다
//다중 상속이란? 부모 클래스를 여러개 만들어서 자식 클래스가 부모 클래스 두 개를 다 상속 받게 하는 것
class Child extends Father,Mother { //<-다중 상속이 불가능!
}
*/
Sample 46- HeClass
package cls;
import inter.Myinterface;
import inter.Youlnterface;
public class HeClass implements Myinterface, Youlnterface {
@Override
public void youfunc() {
System.out.println("HeClass youfunc");
}
@Override
public void abMethod() {
System.out.println("HeClass abMethod");
}
}
Sample 46- myClass ( 규칙판을 가져와서 지키겠다고 선언)
package cls;
import inter.Myinterface;
public class MyClass implements Myinterface{
@Override// MyClass 에러 밑에 가져다 대고 add 누르면 자동 생성
public void abMethod() {
System.out.println("MyClass abMethod()");
}
}
//인터페이스 때는 이렇게 적어야 함 -> 시행하다:implements
Sample 46- Myinterface
package inter;
public interface Myinterface {
//Class 위치에 interface 가 있을 뿐 클래스와 차이는 없다
/*
[interface특징 ]
1. 변수 선언이 불가하다
private int number;
2.일반 메소드 선언 불가
public void method() {
}
*/
//추상 메소드로만 이루어져 있다.
public void abMethod();
}
Sample 46- Youinterface
package inter;
public interface Youlnterface {
public void youfunc();
}
Sample 46-출력결과
HeClass abMethod
HeClass youfunc
HeClass abMethod
student
student- Main Class
package main;
import java.util.Scanner;
import dao.StudentDao;
import dao.StudentDaoMpl;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
// 학생정보 관리 클래스
// menu 위에 생성하는 이유 :
StudentDao dao = new StudentDaoMpl();
// menu 구성하기
//1. 무한으로 돌려주기 -> while이 정석
while(true) {
System.out.println();
System.out.println(">>>>>>>>>>학생정보 프로그램 >>>>>>>>>>>");
System.out.println("1. 학생정보 추가");
System.out.println("2. 학생정보 삭제");
System.out.println("3. 학생정보 검색");
System.out.println("4. 학생정보 수정");
System.out.println("5. 모두 출력");
System.out.println("6. 과목 1등");
System.out.println("7. 점수의 총점과 평균 ");
//입력받을 부분 생성
Systehttp://m.out.print("작업 >> ");
int work = sc.nextInt();
switch(work) {
case 1:
dao.insert(); //dao를 통해서 insert 가 나오게 해 준다
break;
case 2:
dao.delete();
break;
case 3:
dao.select();
break;
case 4:
dao.update();
break;
case 5:
dao.allprint();
break;
case 6:
dao.top();
break;
case 7:
dao.sum_avg();
break;
}
}
}
}
Student-StudentDto
package dto;
//Data Transfer Object
//Dto = data transfer object
//기본 생성자 만들고 using , getter setter, to string 만들면 Dto 완성
public class StudentDto {
private String name;
private int age;
private double height;
private int kor;
private int eng;
private int math;
//첫번째 기본생성자 만들기
public StudentDto() {
}
//Source -> using 들어가서 생성
public StudentDto(String name, int age, double height, int kor, int eng, int math) {
this.name = name;
this.age = age;
this.height = height;
this.kor = kor;
this.eng = eng;
this.math = math;
}
//setter and getter
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 double getHeight() {
return height;
}
public void setHeight(double height) {
this.height = height;
}
public int getKor() {
return kor;
}
public void setKor(int kor) {
this.kor = kor;
}
public int getEng() {
return eng;
}
public void setEng(int eng) {
this.eng = eng;
}
public int getMath() {
return math;
}
public void setMath(int math) {
this.math = math;
}
@Override
public String toString() {
return "StudentDto [name=" + name + ", age=" + age + ", height=" + height + ", kor=" + kor + ", eng=" + eng
+ ", math=" + math + "]";
}
}
Student-StudentDaoClass
package dao;
public interface StudentDao {
public void insert();
public void delete();
public void select();
public void update();
public void allprint();
public void top();
public void sum_avg();
}
Student-StudentDtompl Class
package dao;
import java.util.Scanner;
import dto.StudentDto;
// Data Access Object
public class StudentDaoMpl implements StudentDao{
Scanner sc = new Scanner(System.in);
private StudentDto students[] = { // dummy data
new StudentDto("홍길동", 24, 172.1, 90, 80, 85),
new StudentDto("성춘향", 15, 154.3, 90, 90, 95),
new StudentDto("일지매", 22, 180.2, 85, 75, 90),
};
private int count;
public StudentDaoMpl() {
//students = new StudentDto[10];
count = 3;
}
@Override
public void insert() {
System.out.println("학생정보 추가 >>");
System.out.print("이름 = ");
String name = sc.next();
System.out.print("나이 = ");
int age = sc.nextInt();
System.out.print("키 = ");
double height = sc.nextDouble();
System.out.print("국어 = ");
int kor = sc.nextInt();
System.out.print("영어 = ");
int eng = sc.nextInt();
System.out.print("수학 = ");
int math = sc.nextInt();
students[count] = new StudentDto(name, age, height, kor, eng, math);
count++;
}
@Override
public void delete() { // 이름 -> "", 나이 -> 0
System.out.println("학생정보 삭제입니다");
int index = search();
if(index == -1) {
System.out.println("학생정보를 찾을 수 없습니다");
}else {
students[index].setName("");
students[index].setAge(0);
students[index].setHeight(0.0);
students[index].setKor(0);
students[index].setEng(0);
students[index].setMath(0);
System.out.println("학생정보를 삭제하였습니다");
}
}
@Override
public void select() { // 이름 -> 출력
System.out.println("학생정보를 검색합니다");
// 이름입력
System.out.print("이름 = ");
String name = sc.next();
// 배열 -> index
int index = -1;
for (int i = 0; i < students.length; i++) {
if(name.equals(students[i].getName())){
index = i;
break;
}
}
if(index == -1) {
System.out.println("학생정보를 찾을 수 없습니다");
}
else {
System.out.println(students[index].toString());
}
}
@Override
public void update() { // 이름 -> 수정: 국어, 수학, 영어
System.out.println("학생정보 수정입니다");
int index = search();
if(index == -1) {
System.out.println("학생정보를 찾을 수 없습니다");
return;
}
System.out.println("수정할 데이터를 입력해 주세요");
System.out.print("국어 = ");
int kor = sc.nextInt();
System.out.print("영어 = ");
int eng = sc.nextInt();
System.out.print("수학 = ");
int math = sc.nextInt();
students[index].setKor(kor);
students[index].setEng(eng);
students[index].setMath(math);
System.out.println("데이터를 수정하였습니다");
}
@Override
public void top() {
System.out.println("과목에 대한 top 점수와 학생명을 출력합니다");
System.out.print("원하는 과목의 번호입력(국어(1),영어(2),수학(3)) = ");
int number = sc.nextInt();
if(number == 1) { // 국어
int max = students[0].getKor();
for (int i = 0; i < students.length; i++) {
if(students[i].getKor() > max) {
max = students[i].getKor();
}
}
for (int i = 0; i < students.length; i++) {
if(max == students[i].getKor()) {
System.out.print("국어의 최고 점수는 " + max + "이고 ");
System.out.println("학생의 이름은 " + students[i].getName() + "입니다");
}
}
}
else if(number == 2) { // 영어
}
else if(number == 3) { // 수학
}
}
@Override
public void sum_avg() {
System.out.println("학생점수의 총점과 평균입니다");
for (int i = 0; i < students.length; i++) {
int sum = students[i].getKor() + students[i].getEng() + students[i].getMath();
double avg = Math.round( ((double)sum / 3) * 10 ) / 10;
System.out.println(students[i].getName() + "> 총점:" + sum + " 평균:" + avg);
}
}
public int search() {
// 이름입력
System.out.print("이름 = ");
String name = sc.next();
// 배열 -> index
int index = -1;
for (int i = 0; i < students.length; i++) {
if(name.equals(students[i].getName())){
index = i;
break;
}
}
return index;
}
@Override
public void allprint() {
for (StudentDto dto : students) {
if(dto != null && !dto.getName().equals("")) {
System.out.println(dto.toString());
}
}
}
}
오후 수업 변수의 종류 , Static
자바에서 메모리를 아끼고 효율적으로 쓰기 위한 '치트키'!
Sample 47
Sample 47- Mainclass
public class MainClass {
public static void main(String[] args) {
// TODO Auto-generated method stub
/*
[변수의 종류 - variable ]
local variable ( 지역변수) -> stack 영역에 올라간다 ->블록안에서 연산을 처리하기 위한 변수
parameter variable(매개 변수) -> stack 영역에 올라간다
(class) member variable (멤버 변수 )
static variable(정적 변수 )
📦 1. 변수의 종류 (내 변수의 수명은 언제까지일까?)
|
*/
int number=0; // 지역변수
System.out.println(number); //int number; 지역변수가 이 상태면 number 밑에 에러 난다 반드시 지역변수 초기화 할것
MyClass my = new MyClass();
my.method();
{//블록안에 집어넣는 변수 -> 지역변수에 해당
String name = "홍길동";
}
my.func(23);
}
}
Sample 47- myClass
package Sample47;
public class MyClass {
private int count; // 멤버변수 -> heap 영역에 올라간다
public void method() {
int number; //local variable ( 지역변수)에 해당한다 public void method 밖에서는 실행이 안 된다
System.out.println("count:" + count);
}
//int num = 파라메타 가인수에 해당한다 -> 밖에서 값을 받아오기 위한 변수
public void func(int num) {
num = num +1;
}
public void name(int count) {
this.count = 12;
count =22;
}
}
Sample 47 -출력결과
0
count:0
Sample 48
Sample48-MainClass
package Sample48;
public class MainClass {
public static void main(String[] args) {
/*
static : 정적 -> (메모리저장 영역)움직이지 않는다
variable(변수) global(전역)
function(함수)
*/
2. Static (공공의 재산, 공유 치트키)오늘 오후 수업의 주인공은 바로 이 static이에요! 블로그에 "움직이지 않는다", "정적"이라고 적어두셨죠? 자바에서 static이 붙으면 "객체(new)를 만들지 않아도 메모리에 항상 딱 고정되어 존재한다"는 뜻이에요.
|
MyClass mycls = new MyClass();
mycls.method();
mycls.method();
mycls.method();
MyClass myclsOne = new MyClass();
myclsOne.method();
myclsOne.method();
MyClass.st_number++;
System.out.println(MyClass.st_number);
}
}
Sample48-MyClass
package Sample48;
public class MyClass {
int mem_number; // 멤버변수
static int st_number; // 정적변수
public void method() {
int loc_number = 0; // 지역변수
loc_number++;
mem_number++;
st_number++;
System.out.println("loc_number: " + loc_number);
System.out.println("mem_number: " + mem_number);
System.out.println("st_number: " + st_number);
}
}
Sample49-
Sample49-MainClass
package Sample49;
import java.util.Calendar;
import java.util.GregorianCalendar;
public class MainClass {
public static void main(String[] args) {
/*
Static
변수 -> global
함수 -> global
*/
MyClass.gl_number = 23;
MyClass.static_method();
/*
Game game = new Game();
game.init();
game.valueSet();
*/
Game game = Game.getInstance();
// Calender cal = new GregorianCalendar();
Calendar cal = Calendar.getInstance();
int year = cal.get(Calendar.YEAR);
String strNum = "123";
int number = Integer.parseInt(strNum);
}
}
Sample49-GameClass
package Sample49;
public class Game {
public Game() {
}
public void init() {
}
public void valueSet() {
}
public static Game getInstance() {
Game g = new Game();
g.init();
g.valueSet();
return g;
}
}
Sample50
Sample50 Main Class
public class Mainclass {
public static void main(String[] args) {
// TODO Auto-generated method stub
/*
final : 제약
변수, 메소드, 클래스
*/
🔒 3. Final (절대 변경 금지! 자바의 콘크리트)마지막으로 배운 final은 단어 뜻 그대로 "최종본이니까 절대 건드리지 마!"라는 제약 규칙이에요.① 변수 앞에 붙을 때 ➡️ 상수가 됨!
② 클래스나 메서드 앞에 붙을 때 ➡️ 상속/오버라이드 금지!
|
final int number = 10; // static 로컬 변수는 스타틱이 되지 않아요 ! 멤 버 변수는 가능 ㅋㅋ
// number = 11; 이렇게 하면 바로 에러 뜸 =-> final 이 붙는 순간 변수는 상수가 되어버린다 지금부터 넘버는 10이 되는 것
//그럼 어디다 쓰나요? -> 대입하는 용도로 사용한다
int count = number ;
// 위처럼 초기값이나 대입 용도로 많이 사용한다.
final int NUMBER = 10; //상수로 지정할 때는 대문자를 사용한다
int count1 = NUMBER; //대부분 final 을 사용할 때 정해진 규칙은 아니지만 대문자를 주로 사용한다
final int Max = 10;
final int MIN = 1;
int counter = 5;
if (counter>= MIN && counter <= Max) {
}
}
}
final class Parent{//final 을 클래스 앞에 붙이면 ? -> 상속 금지 !!!!!!
public final void method() { //over ride 금지 !
}
}
//class Child extends Parent{ // 상속 도지 않음
// public void method() { //over ride 안됨
//
// }
//}
💡 오후 수업 한 줄 요약!
변수는 **어디서 생기고 언제 죽는지(수명)**가 다르고, static은 다 같이 나눠 쓰는 공용 공간을 만드는 것이며, final은 절대로 값을 바꾸거나 변형할 수 없게 자물쇠를 채우는 것이다!
'Java > Java 수강일지' 카테고리의 다른 글
| [수강일지_18] 실전! 주소록 프로그램 만들기 (0) | 2026.06.04 |
|---|---|
| [수강일지_17] Generic , list (0) | 2026.06.02 |
| [수강일지_15] 상속성 ,다향성,오버라이드, 강제형변환(cats) (1) | 2026.05.29 |
| [수강일지_14] 학생정보 관리 프로그램 만들기 (1) | 2026.05.28 |
| [수강일지_13] , hiding, constructor,objectArray, work13 풀이,OOP 3대 특성 (0) | 2026.05.27 |