[JAVA] 클래스와 객체

클래스(class)

클래스는 객체를 정의하는 설계도입니다.

 

클래스란? 현실 세상에 존재하는 대부분의 것들은 클래스로 표현할 수 있습니다.

객체

객체란 클래스(설계도)를 통해 현실 세계에 뿌리내릴 수 있는 것을 말합니다.
아직 현실 세계에 존재 하지는 않지만 존재할 가능성이 있는 것을 객체라고 합니다.

사자 클래스를 정의하였습니다. 사자는 이 세계에 존재할 수 있는 객체(Object)입니다.

하지만 동물 클래스를 설계하고 이 세계에 뿌리내리게 하는 것은 불가능합니다. 왜냐하면 동물은 이 세계에 존재할 수 없는 것이기 때문입니다. 동물은 사자, 호랑이, 기린 같은 것들을 어우를 수 있는 포괄적인 개념입니다. 이런 것들은 실제 세상에 존재할 수 없기 때문에 객체가 될 수 없습니다. 동물 클래스는 추상적인 것입니다.

프로그래밍 세상에서 객체란 메모리(프로그래밍 세상)에 로드할 수 있는 것을 말하며 객체가 될 수 없다는 것은 메모리(프로그래밍 세상)에 로드할 수 없다는 뜻입니다.

객체 지향적 프로그래밍 설계란?



● 이름을 바로 잡는 일이다. 곧 대상 사물의 의미를 정확히 나타낼 수 있는 바른 이름(정명론)
"임금은 임금답고 신하는 신하답고 아버지는 아버지답고 자식은 자식답게[군군신신 부부자자] 되는 것입니다."
"학생은 학생 다워야 한다. "

▶ 합당한 이름을 붙이고 그 취지에 맞게 상태(변수)와 행위(메서드)를 정의하여 만들고 다른 객체들과 협력하거나 상호 작용하게 코드를 설계한다.

 

 

클래스 설계

student 클래스

// 클래스를 설계 할 때 이름을 잘 짓는 것이 중요하다.

// Student class 설계 도면

public class Student {

// 속성

int age;

double weight;

// 문자열이라는 데이터 타입이다.

String name = "안녕";

 

//기능

Warrior 클래스

public class Warrior {

 

//속성(상태) - 멤버 변수

int damage; // 공격력

String name;

String color;

double height;

 

//기능 ....

객체 생성

(클래스 안에 있는 속성 사용)

student 클래스 사용

//코드의 시작점

public static void main(String[] args) {

 

Student kim;

Student hong; //변수의 선언

hong = new Student(); // 변수의 초기화

 

hong.age =10; // .연산자는 객체 안으로 들어간다

 

//화면에 hong age 값을 출력 하시오

System.out.println(hong.age);

}

Warrior 클래스 사용

public class MainTest2 {

 

// 메인 함수

public static void main(String[] args) {

 

//메인 함수 안에 선언하는 변수는 -- 지역 변수

 

Warrior w1; // 변수의 선언 --> 참조 타입

// new 키워드를 만나면 메모리에 올려 준다

// 메모리에 올라가면 프로그램 세상에 존재 하게 된다.

 

w1 = new Warrior();

 

w1.name = "작은 오크";

w1.color = "초록색";

w1.height = 50;

w1.damage = 100;

 

Warrior w2;

w2 = new Warrior();

w2.name = "큰 오크";

w2.color = "파란색";

w2.height = 200;

w2.damage = 500;

 

}

 

}

 

 

함수란 (function)

● 하나의 기능을 수행하는 일련의 코드
● 구현된(정의된) 함수는 호출하여 사용하고 호출된 함수는 기능이 끝나면 제어가 반환됨
● 함수로 구현된 하나의 기능은 여러 곳에서 동일한 방식으로 호출되어 사용될 수 있음

 

함수 정의하기


● 함수는 이름, 매개 변수, 반환 값, 함수 몸체(body)로 구성됨
int add(int num1, int num2) {

 

int add(int num1, int num2) {

int result;

result = num1 + num2;

return result;

 

}

함수 호출과 스택 메모리

● 스택 : 함수가 호출될 때 지역 변수들이 사용하는 메모리
● 함수의 수행이 끝나면 자동으로 반환 되는 메모리

함수 예제 (덧셈과 뺄셈)

// 함수란

 

// 두개의 매개 변수를 받아서 덧셈하는 기능을 만들기

// 함수를 선언하는 문법

public static int addNumber(int n1, int n2) {

// 결과를 담을 변수를 선언

int result;

result = n1 + n2;

return result;

}

 

public static double minusNumber(int n1, int n2) {

double result;

result = n1 - n2;

return result;

}

 

public static void main(String[] args) {

 

System.out.println("결과");

 

int returnValue = addNumber(10, 5); // 함수를 호출 하는 문법

System.out.println(returnValue);

int returnValue2 = addNumber(100, 7895);

System.out.println(returnValue2);

 

//함수 호출은 모양 맞추기다 이다

double returnValue3 = minusNumber(5, 100);

System.out.println(returnValue3);

}

결과

15

7995

-95.0

함수 예제 2

// 메인 함수

public static void main(String[] args) {

 

sayHello("안녕 좋은 아침이야");

sayHello("반가워");

int result = calcSum();

System.out.println(result);

 

}// end of main

 

// 함수에는 여러가지 종류가 있다. - 정수값을 반환하는 함수

public static int add(int n1, int n2, int n3) {

// 함수 안에 사용하는 변수는 - 지역 변수라고 한다.

// return 키워드 뒤에 바로 식을 사용할 수도 있다.

return n1 - n2 - n3;

}

 

// 아무것도 반환 하지 않는 함수도 있다

// void -> 텅 빈

public static void sayHello(String greeting) {

 

System.out.println(" ** " + greeting + "** ^^");

}

 

// 매개 변수는 반드시 없어도 된다

public static int calcSum() {

int sum = 0, i = 1;

for(i = 1; i <= 100; i++) {

sum += i;

 

}

return sum;

}

결과

** 안녕 좋은 아침이야** ^^

** 반가워** ^^

5050

함수 인자 3 개사칙연산

public static void main(String[] args) {

 

System.out.println("결과");

// 함수를 호출해서 실행 하시오

int a = add(3, 3, 3);

int m = minus(3, 3, 3);

int m2 = multiply(3, 3, 3);

int d = division(3, 3, 3);

System.out.println(a);

System.out.println(m);

System.out.println(m2);

System.out.println(d);

 

}// end of main

 

// 덧셈 뺄셈 곱셈 나눗셈

// 더하기

public static int add(int a, int b, int c) {

int result = a + b + c;

return result;

}

 

// 빼기

public static int minus(int a, int b, int c) {

int result = a - b - c;

return result;

}

 

// 곱셈

public static int multiply(int a, int b, int c) {

int result = a * b * c;

return result;

}

 

// 나눗셈

public static int division(int a, int b, int c) {

int result = a / b / c;

return result;

}

결과

9

-3

27

0


class 와 객체의 의미를 이해하자


class - 객체를 만들기 전에 속성(상태)와 기능을 설계하는 도면
객체 : 실제 메모리에 올라간 녀석(프로그램 세상에 존재하게 됨)
객체를 설계할 때 클래스 안에 정의하는 변수는 : 멤버 변수
main 함수에서 사용하는 변수는 : 지역 변수

자료형(기본 데이터 타입) 변수는 스택(stack)에 할당
참조 타입 변수는 힙(heap) 에 할당

 

함수와 메서드의 차이점


메서드는 멤버 변수를 활용해서 그 객체의 이름에 맞는 기능을 정의
함수는 하나의 기능을 수행하는 일련의 코드 묶음이다.

 

함수

학생

public class Student {

 

// 멤버 변수 파란색 지역변수 노란색

int studentId; // 기본 데이터 타입

String studentName; // 참조 타입

String address;

double weight;

 

// 기능 정의

// 메모리 영역이 다른곳에 잡힘 static void

public void study() {

System.out.println(studentName + "이(가) 공부를 합니다");

}

 

public void breakTime() {

System.out.println(studentName + "이(가) 휴식을 합니다");

}

 

public void showInfo() {

System.out.println("====== 상태창 ========");

System.out.println(studentName + "의 ID : " + studentId);

System.out.println(studentName + "의 name : " + studentName);

System.out.println(studentName + "의 주소 : " + address);

System.out.println(studentName + "의 몸무게 : " + weight);

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

}

 

// 함수와 메서드의 차이점

// 메서드는 멤버 변수를 활용해서 그 객체의 이름에 맞는 기능을 정의

// 함수는 하나의 기능을 수행하는 일련의 코드 묶음이다.

}

학생

public class StudentMainTest1 {

 

public static void main(String[] args) {

 

Student studentKim = new Student();

studentKim.studentId = 1;

studentKim.studentName = "티모";

studentKim.address = "블루진영";

 

studentKim.study();

studentKim.breakTime(); // 끝에 괄호가 있으면 함수

studentKim.showInfo();

 

Student studentLee = new Student();

studentLee.studentId = 2;

studentLee.studentName = "야스오";

studentLee.address = "레드진영";

studentLee.showInfo();

// 멤버 변수는 값을 초기화 하지 않으면 기본 값으로

// 컴파일러가 값을 넣어서 만들어 준다.

}

 

}

결과

티모이(가) 공부를 합니다

티모이(가) 휴식을 합니다

====== 상태창 ========

티모의 ID : 1

티모의 name : 티모

티모의 주소 : 블루진영

티모의 몸무게 : 0.0

====================

====== 상태창 ========

야스오의 ID : 2

야스오의 name : 야스오

야스오의 주소 : 레드진영

야스오의 몸무게 : 0.0

====================

버스 요금 계산기

public class Bus {

 

// 속성

int busNumber;

int count; // 승객수

int money; // 수익금

 

// 기능

 

public void take(int m) {

// 0 = 0 + 1300; ... 1300

// 1300 = 1300 + 1300 ... 2600

money += m;

count ++;

}

 

public void showInfo() {

System.out.println("====== 상태창 =======");

System.out.println("버스 번호 : " + busNumber);

System.out.println("승객 수 : " + count);

System.out.println("현재 수익금 : " + money);

}

 

}

버스

public class busMainTest {

 

public static void main(String[] args) {

 

Bus bus100 = new Bus();

Bus bus200 = new Bus();

 

//System.out.println(bus100);

bus200.busNumber = 200;

 

for(int i =1; i <= 100; i++) {

bus200.take(1300); // 2 사람

}

//bus200.take(1300); // 1 사람

 

 

bus200.showInfo();

 

//오류노트 작성

}

 

}

결과

====== 상태창 =======

버스 번호 : 200

승객 수 : 100

현재 수익금 : 130000

주급 계산기

출근 시간, 퇴근 시간, 일한 시간을 이용하여 주 15시간 넘게 근무했으면 주휴수당을 주는 프로그램을 만들어보자

(여기서 주휴수당은 20프로)

public class workHard {

// 알바생

// 출근

// 퇴근

// 일당

 

String name;

int c, t, s;

double m;

int sum;

 

 

public void in() {

System.out.println(name + " 출근");

}

 

public void out() {

System.out.println(name + " 퇴근");

}

 

public void money(){

System.out.println("이번 주 주급은 : " + sum + "원");

}

}

주휴수당 계산기

import java.util.Scanner;

 

public class workHardTest {

 

public static void main(String[] args) {

workHard alba = new workHard();

 

String d;

int sum = 0, total = 0;

for(int i=1; i < 8; i++) {

if (i == 1) {

d = "월요일";

}

else if (i==2) {

d= "화요일";

}

else if (i==3) {

d= "수요일";

}

else if (i==4) {

d= "목요일";

}

else if (i==5) {

d= "금요일";

}

else if (i==6) {

d= "토요일";

}

else {

d= "일요일";

}

alba.name = "알바생";

alba.in();

System.out.print( d + " 출근 시간 : ");

Scanner sc = new Scanner(System.in);

alba.c = sc.nextInt();

 

System.out.print( d + " 퇴근 시간 : ");

alba.t = sc.nextInt();

alba.out();

 

alba.s = alba.t - alba.c; //일한 시간

total += alba.s;

System.out.println("오늘 일한 시간은 : " + alba.s);

System.out.println("총 일한 시간은 : " + total);

//m = (t - c) * 9620;

alba.m = (alba.t-alba.c) * 9620; // 일당

alba.sum += alba.m;

}

 

 

//alba.c = 9;

//alba.t = 24;

 

 

//alba.sum += sum;

if(total>=15) {

System.out.println("주 15시간 넘게 근무하셔서 주휴수당을 받을 수 있습니다");

alba.sum *= 1.2; // 주휴수당

}else {

System.out.println("주휴수당을 못 받습니다");

alba.sum *= 1;

}

alba.money();

}

 

}

결과

월요일 ~ 일요일 출근시간을 0 퇴근시간을 5로 입력한 경우

알바생 출근

월요일 출근 시간 : 0

월요일 퇴근 시간 : 5

알바생 퇴근

오늘 일한 시간은 : 5

총 일한 시간은 : 5

알바생 출근

화요일 출근 시간 : 0

화요일 퇴근 시간 : 5

알바생 퇴근

오늘 일한 시간은 : 5

총 일한 시간은 : 10

알바생 출근

수요일 출근 시간 : 0

수요일 퇴근 시간 : 5

알바생 퇴근

오늘 일한 시간은 : 5

총 일한 시간은 : 15

알바생 출근

목요일 출근 시간 : 0

목요일 퇴근 시간 : 5

알바생 퇴근

오늘 일한 시간은 : 5

총 일한 시간은 : 20

알바생 출근

금요일 출근 시간 : 0

금요일 퇴근 시간 : 5

알바생 퇴근

오늘 일한 시간은 : 5

총 일한 시간은 : 25

알바생 출근

토요일 출근 시간 : 0

토요일 퇴근 시간 : 5

알바생 퇴근

오늘 일한 시간은 : 5

총 일한 시간은 : 30

알바생 출근

일요일 출근 시간 : 0

일요일 퇴근 시간 : 5

알바생 퇴근

오늘 일한 시간은 : 5

총 일한 시간은 : 35

주 15시간 넘게 근무하셔서 주휴수당을 받을 수 있습니다

이번 주 주급은 : 404040원

 

 

 

오늘의 퀴즈

 

1번

보기 중 고르시오

보기 1. 지역변수 2. 멤버변수

1-1 객체를 설계할 때 클래스 안에 정의하는 변수는?

1-2 main 함수에서 사용하는 변수는

정답

더보기

1-1 : 2

2-1 : 1

 

2번

다음 중 객체가 아닌 것은?(여러개 가능)

보기

1. 가구 2. 동물 3. 호랑이 4. 의자

 

정답

더보기

1, 2

 

3번

3-1 자료형(기본 데이터 타입) 변수는 (    )에 할당
3-2 참조 타입 변수는 (    ) 에 할당

보기

1. 스택 2. 힙

 

정답

더보기

3-1 : 1

3-2 : 2

 

 

주의할 점

● 클래스는 대문자로 시작하는것이 좋음

● java 파일 하나에 클래스는 여러 개가 있을 수 있지만, public 클래스는 하나이고, public 클래스와 .java 파일의 이름은 동일함

● camel 표기법 첫단어의 시작만 소문자로 시작하고 나머지 단어의 시작은 대문자로 ex) goodMan

클래스 하나만 생성해도 여러곳에서 호출해서 사용가능

참조 타입은 String은 첫글자 대문자

char 는 ' ' String은 " "