Java/Java 수강일지

[수강일지_12] 객체지향 프로그래밍 void,cal

jamk-diary 2026. 5. 26. 19:59

절차지향 프로그래밍 -> 객체지향 프로그래밍

 

절차지향 프로그래밍

sorting-> 변수선언 > 정렬갯수 -> 배열 확보 ->  오름 / 내림 -> 정렬 처리 -> 결과 출력 

 

객체지향 프로그래밍 -> O.O.P -> Objest Oriented Programing

입력 부분 -> 정렬 처리 부분 -> 결과 부분 

 

Variable(변수) -> 데이터를 저장 

 

Function(함수) -> 처리 

 

class --> 프로그램 설계도 

 

따라서 oop의 첫번째 조건은 프로그램 설계도를 활용해 함수 만들기 

Mainclass 와 MyClass 를 만들고 메인에서 마이 클래스 호출하기 

/*

Class : 객체 지향의 설계자

(멤버) 변수

(멤버) 메소드

*/

 

public class Mainclass {

 

public static void main(String[] args) {

/*

Class : 객체 지향의 설계자

(멤버) 변수

(멤버) 메소드

 

형식:

(클래스) 설계도

Class 클래스 명 {

변수의 선언부

 

메소드 선언부 == 함수

} ]

(객체) 생성

클래스명 변수 = new 클래스명();

변수 = 객체,object, instance(먼저 주기 )

 

 

 

변수.메소드 ();

변수. 멤버 변수 = 1;

*/

 

//예제 구현하기

 

//객체를 생성

MyClass cls = new MyClass();

//cls: 객체, instance

 

cls.method();

 

cls.number=10;

cls.name= "성춘향";

cls.height=157.3;

 

}

 

}


MyClass method()

 


public class MyClass {

// mainclass 안에 넣으면 안 됨! 에러 뜹니당

//변수의 영역 (Area)

int number;

String name;

double height;

 

// 메소드의 영역

void method( ) {

number = 1;

name = "홍길동";

height = 172.1;

 

System.out.println("MyClass method()");

}

}


 

Main Class 에서 Game  클래스와 calculator 클래스를 호출해보자 !

public class MainClass {

 

public static void main(String[] args) {

// 메인 클래스 안에 Calculator 를 불러오기

// 작업을 분산함으로써 메인 클래스 안에서 작업을 조금 더 깔끔하게 진행할 수가 있다

 

 

//1. Calculator 클래스

/*

Calculator cal = new Calculator();

cal.input ();

cal.process();

cal.result();

*/

 

// Game클래스

Game cal = new Game();

cal.init();

cal.play();

cal.result();

// cal.input 은 필요가 없대 왜?

// Game 클래스에서 void input() 을 void play 안에서 넣어줬거든 ㅎㅎ

}

 

}


import java.util.Scanner;

 

public class Calculator {

 

// 변수

int number1, number2;

String operator;

int result;

// 메소드

void input() {

Scanner sc = new Scanner(System.in);

 

System.out.print("첫번째 수 = ");

number1 = sc.nextInt();

 

System.out.println("+,-,*,/)=");

operator = sc.next();

 

System.out.print("두번째 수 = ");

number2 = sc.nextInt();

}

void process() {

switch (operator) {

case "+":

result = number1 + number2;

break;

 

case "-":

result = number1 - number2;

break;

 

case "*":

result = number1 * number2;

break;

 

case "/":

result = number1 / number2;

break;

}

}

void result() {

System.out.println(number1 + " " + operator + " " + number2

+ " = " + result);

}

}


import java.util.Scanner;

 

public class Game { // Random 게임을 만들어 봐요 !

/*

[풀이과정]

1. void -- 를 작성하기

2. 멤버 변수 선언하기 -> 왜? 하나요? void 가 여러번 쓰일 때는 멤버 변수를 사용해요 ! 만약 void 가 한 번만 쓰인다면 굳이 필요하지 않아요

즉, 두 개 이상의 메소드가 쓰일 때 사용됩니다

3.

 

*/

 

//[멤버변수]

int rand_num, user_num;

Boolean clear;

 

void init() { // Random 숫자를 설정하는 코드

clear = false;

rand_num=(int)(Math.random()*100) +1;

System.out.println("rand_num:" + rand_num);

}

 

void input() { // user 입력을 받는 코드

Scanner sc = new Scanner(System.in);

System.out.print("1~100 사이의 숫자 =");

user_num =sc.nextInt();

}

 

void play () { // loop 를 진행하는 코드

// 객체 지향을 햘 때는 변수를 길게 적지 않아요! 단순하게 적어주세요 playLoop 보다는 Play 추천 !

int w = 0;

 

 

 

while ( w<10) {

input();

// 위에서 만든 void input() 을 play 안에 있는 wile 문에 넣어줄거야 ! 그럼

//MainClass 에서 Play 만 호출해도 돼 !

if(user_num > rand_num) {

System.out.println("너무 큽니다");

}

else if ( user_num < rand_num) {

System.out.println("너무 작습니다");

}

else {

System.out.println("빙고!");

clear = true;

break;

}

w++;

}

}

 

void result() { // clear/over // 게임을 clear 했는지 over 했는지 확인하는 코드

if(clear) {

System.out.println("게임 클리어");

}else {

System.out.println("게임 오버");

}

}

 

 

 

 

 

}


과제 1 - sorthing 클래스 생성해서 메인클래스에서 실행 해보기 

// sorting 클래스

 

sorting so = new sorting();

so.input();

so.sort();

so.result();

 


정렬할 수의 갯수 입력 = 4

1 번째 숫자 = 456

2 번째 숫자 = 654

3 번째 숫자 = 568

4 번째 숫자 = 88

오름차순이면 1, 내림차순이면 2입력 = 1

88,456,568,654,

 


 

import java.util.Scanner;

 

public class sorting {

 

 

 

int number[] = null; // 정렬처리를 진행하기 위해서는 먼저 배열이 필요하다.

boolean up; // 오름/내림차순 하려면 int 가 아닌 boolean 으로 진행해야 함

 

 

 

//encapsulation(캡슐화) -> 클래스 안에 전부 집어넣는 것 

//입력처리

void input() {

Scanner sc = new Scanner(System.in); // 스캐너는 여기만 있으면 됨

System.out.print("정렬할 수의 갯수 입력 = ");

int count = sc.nextInt();

 

number = new int [count]; // 입력할 갯수를 number메인 변수 안에 넣어줌

 

for (int i = 0; i < number.length; i++) {

System.out.print((i +1) +" 번째 숫자 = "); // 숫자 입력 받는 중

number[i] = sc.nextInt();

}

 

//오름, 내림 차순 선택하렴

System.out.print("오름차순이면 1, 내림차순이면 2입력 = ");

int num = sc.nextInt();

 

if(num==1) up = true;

else up = false;

 

/* 위처럼 사용해도 되고 이렇게 써도 됨

up = true;

if(num==1) up =false;

*/

 

}

 

//정렬처리

void sort() {

int temp;

 

for(int i = 0; i < number.length - 1; i++) {

for(int j = i + 1; j < number.length; j++) {

// 오름차순

if(up ) {

if(number[i] > number[j]) {

temp = number[i];

number[i] = number[j];

number[j] = temp;

}

}

// 내림차순

else {

if(number[i] < number[j]) {

temp = number[i];

number[i] = number[j];

number[j] = temp;

}

}

}

}

 

 

 

 

 

}

 

 

//결과 출력

void result () {

for(int i = 0;i<number.length; i ++)

System.out.print(number[i] + ",");

}

 

}

 

// swap 넣어서 하는 거 못 따라갔음 ! 수업 끝나구 고치장


클래스명 ==>  sorting

 

메인 변수 설정 ==> number[] : int   , up: boolean

 

메소드 ==> input() , sort () ,result () swap ( i : int, j :int)

 

제목 없는 다이어그램 - draw.io

제목 없는 다이어그램 - draw.io

제목 없는 다이어그램 - draw.io

과제 풀어보기 

[내 풀이 ]

 

 

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileWriter;

import java.io.IOException;

import java.io.PrintWriter;

 

public class Mainclass {

 

public static void main(String[] args) {

// 과제 2

 

//홍길동 (이름,나이,주소)배열

//성춘향 (이름,나이,주소)배열

//일지매 (이름,나이,주소)배열

 

//홍길동 + 성춘향 +일지매 = 다 합한 최종 배열 출력 ?

 

//홍길동 배열

String Hong []= { "홍길동" , "20" , "형제나라"};

 

//성춘향 배열

String Sung []= { "성춘향" , "20" , "기생나라"};

 

//일지매 배열

String One [] = { "일지매" , "20", "의적나라"};

 

 

 

 

//파일 생성

File file = new File("C:\\tmp\\text.txt"); 

 

FileWriter fw;

 

try {

fw = new FileWriter(file);

BufferedWriter bw = new BufferedWriter(fw);

PrintWriter pw = new PrintWriter(bw);

 

for(String s : Hong) {

 

pw.println();

 

}

 

pw.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

 

}

 

 

 

}


import java.io.BufferedReader;

import java.io.File;

import java.io.FileNotFoundException;

import java.io.FileReader;

 

public class Class {

 

public static void main(String[] args) {

// TODO Auto-generated method stub

 

 

File file = new File("C:\\tmp\\text.txt");

 

try {

FileReader fr = new FileReader(file);

BufferedReader br = new BufferedReader(fr);

 

String srt = "";

while ((srt =br.readLine()) != null ) { // -> (str =br.readLine() ) 리드라인 이게 비어있지 않을 때

 

System.out.println(srt);

 

}

 

} catch (Exception e) {

 

// TODO Auto-generated catch block

 

e.printStackTrace();

 

}

 

 

 

}

 

}

 

 


[강사님 풀이 ]

 

 

import java.io.BufferedReader;

import java.io.BufferedWriter;

import java.io.File;

import java.io.FileReader;

import java.io.FileWriter;

import java.io.IOException;

import java.io.PrintWriter;

import java.util.Iterator;

 

public class Mainclass {

 

public static void main(String[] args) {

 

//File Writer

File file = new File("C:\\tmp\\human.txt");

 

String name [] = { "홍길동" , "남궁정민" , "사민"};

 

int age [] = {24,16,22};

 

String address[] = { "서울" , "남원" , "부산"};

 

//이렇게는 안 하는 이유? -> 파일로 저장할 때 이상하게 저장 돼 !

//홍길동24서울시 -> 홍길동-24-서울시

//남궁정민16남원시 -> 남궁정민-16-남원시

//사민22부산시 -> 사민- 22 - 부산시

// 이렇게 - 사이에 이 토큰 - 이걸 넣어줘야 돼

 

String datas [] = new String[3]; // new String[name.length]; -> 이렇게 잡아도 됨 단 이렇게 잡으면 위에 name 배열 내용 바뀔 때 같이 바뀌게 할 수 있음

 

for (int i = 0; i < datas.length; i++) {

datas[i] = name[i] +"-" + age [i] + "-" + address[i];

 

}

for (String s : datas) {

System.out.println(s);

}

 

try {

PrintWriter pw = new PrintWriter( new BufferedWriter(new FileWriter(file))); // 여기까지 쓰면 트라이 / 캐치 나옴

 

for (String s : datas ) {

pw.println(s);

}

pw.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

//File read

 

try {

BufferedReader br = new BufferedReader(new FileReader(file));

String data = " ";

 

 

while (( data = br.readLine()) != null ){

//System.out.println(data);

String d [] = data.split("-");

System.out.println("이름: " + d[0]);

System.out.println("나이: " + d[1]);

System.out.println("주소: " + d[2]);

}

br.close();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

 

}

}


홍길동-24-서울

남궁정민-16-남원

사민-22-부산

이름: 홍길동

나이: 24

주소: 서울

이름: 남궁정민

나이: 16

주소: 남원

이름: 사민

나이: 22

주소: 부산


 

내 풀이와 강사님 풀이를 비교해보고 부족한 점을 파악, 접근방식의 차이를 분석해서 보완해보자 !

 

1. 이미지 속 과제 요구사항 분석

화면 캡처에서 보이는 과제 내용은 다음과 같습니다.
  • 데이터 대상: 홍길동, 성춘향, 일지매(또는 사민 등)의 이름, 나이, 주소 데이터
  • 핵심 미션:
    1. 데이터를 형식에 맞게 파일에 저장하기
    2. 저장된 파일을 다시 읽어오기
    3. 읽어온 데이터에서 나이만 추출하여 총합(Sum) 계산 후 출력하기

2. '내 풀이'와 '강사님 풀이'의 접근 방식 차이

💾 1. 파일을 저장할 때 (정형화 vs 파편화)

  • 내 풀이: 세 사람의 데이터를 각각 독립된 배열(Hong[], Sung[], One[])로 선언했습니다. 그리고 파일에 쓸 때는 for (String s : Hong) 형태로 홍길동 데이터만 파일에 줄바꿈으로 쓰려고 시도했습니다. 이 방식은 데이터가 늘어날 때마다 새로운 배열을 계속 만들어야 하고, 파일 안에서 누구의 데이터인지 구분하기 어렵습니다.
  • 강사님 풀이: 항목별로 배열을 묶은 뒤(name[], age[], address[]), 이를 하나의 반복문 안에서 구분자(토큰: -)를 사용해 홍길동-24-서울과 같이 한 줄의 문자열(데이터 행)로 포맷팅했습니다. 데이터를 파싱(분석)하기 좋은 '정형화된 텍스트' 형태로 변환하여 파일에 저장한 것입니다.

📖 2. 파일을 읽고 처리할 때 (텍스트 출력 vs 데이터 가공)

  • 내 풀이: BufferedReader.readLine()을 사용해 파일의 내용을 한 줄씩 읽어오는 구조는 잘 잡으셨습니다. 하지만 읽어온 문자열(srt)을 화면에 그대로 출력(System.out.println)하는 데 그쳤습니다.
  • 강사님 풀이: 파일을 한 줄씩 읽은 후, 저장할 때 썼던 구분자(-)를 기준으로 split("-")을 사용해 데이터를 다시 쪼갰습니다. 쪼갠 데이터 중 나이에 해당하는 부분(d[1])을 골라내어 가공할 수 있는 상태로 만들었습니다. (비록 강사님 코드에도 화면 출력본만 있고 최종 int 변환 후 합산을 구하는 코드는 생략되어 있지만, 구조적으로 합산을 구할 수 있는 완벽한 전 단계를 구현했습니다.)

3. 내가 '무엇을 이해하지 못했는지' 분석 (약한 부분)

작성하신 코드를 보면 자바의 파일 입출력(FileWriter, FileReader, BufferedReader 등)의 사용법(Syntax) 자체는 훌륭하게 기억하고 활용하셨습니다. 다만 다음 두 가지 개념에서 보완이 필요합니다.

❌ 1. '데이터 구조화(Parsing)'에 대한 이해 부족 (가장 약한 부분)

  • 원인: 데이터를 파일에 저장하는 이유는 나중에 "다시 꺼내서 쓰기 위함"입니다. 내 풀이처럼 이름, 나이, 주소를 그냥 파일에 쭉 쓰게 되면, 나중에 읽어왔을 때 어디서부터 어디까지가 나이이고 주소인지 컴퓨터가 알 방법이 없습니다.
  • 보완점: 데이터를 저장할 때는 반드시 강사님처럼 ,, 이나 -, / 같은 구분자(Delimiter)를 붙여서 저장하고, 읽을 때는 split() 메소드를 사용해 잘라내야 프로그래밍적으로 제어가 가능하다는 것을 이해해야 합니다.

❌ 2. 과제 요구사항의 최종 목적지 인지 부족

  • 원인: 과제의 최종 목적은 "나이의 총합 구하기"였습니다. 이를 위해서는 파일에서 읽어온 문자열 중 '나이'만 쏙 뽑아내어 Integer.parseInt()를 통해 숫자로 바꾼 뒤 누적 합산(sum += age)을 해야 합니다.
  • 보완점: 코드를 작성하기 전에 "나이의 총합을 구하려면 1) 파일 읽기 -> 2) 나이만 추출 -> 3) 숫자로 변환 -> 4) 더하기"라는 로직의 흐름을 먼저 메모장에 설계해 보는 연습이 필요합니다.

💡 요약 및 성장 가이드

  • 잘하신 점: 복잡한 파일 I/O template(Try-Catch 문과 Stream 생성)을 스스로 구현해 내신 것은 기초 문법을 아주 잘 고수하고 계신다는 증거입니다.
  • 앞으로 집중할 점: 데이터를 뭉치고 쪼개는 문자열 조작 메소드(split(), 연산자 활용) 연습이 필요합니다.
강사님 풀이의 흐름을 이해하셨다면, 강사님 코드의 파일 읽기(while문) 내부에서 나이(d[1])를 정수로 변환해 총합을 출력하는 마무리 코드를 직접 완성해 보시는 것을 강력히 추천합니다!

 

과제 

file:///C:/Users/User/Documents/%EC%B9%B4%EC%B9%B4%EC%98%A4%ED%86%A1%20%EB%B0%9B%EC%9D%80%20%ED%8C%8C%EC%9D%BC/Java%EA%B3%BC%EC%A0%9C12.pdf

 

 

MainClass.java
0.00MB
Zoo.java
0.00MB
Coin.java
0.00MB
Game.java
0.01MB
Game2.java
0.00MB
MainClass.java
0.00MB
MyTv2.java
0.00MB
Student.java
0.00MB

 

어렵당 집가서 계속해봐야징