💻 클래스(Class)
클래스 : 객체를 만들기 위한 설계도
- 프로그래밍 언어에 따른 분류
1) 절차지향 방식(작성한 코드의 첫 줄~마지막 줄)
2) 객체지향 방식
- 클래스의 구성요소 : 변수, 메소드의 정의(기능), 생성자
- 클래스는 사용자 정의 자료형
📌 변수의 선언위치에 따른 분류
- 지역변수(local variable): 메소드 안에서 선언된 변수
- 매개변수(parameter): 메소드 정의문의 소괄호 안에서 선언된 변수
- 멤버변수/필드: 클래스 안에서 선언된 변수
- 초기화 하지 않으면 자동으로 default 초기값을 가짐
💻 Setter, Getter 메소드
- 객체 지향 프로그래밍에서 객체 데이터는 객체 외부에서 직접적으로 접근하는 것을 막음. ➡ 객체 지향 프로그래밍에서는 메소드를 통해 데이터를 변경하는 방법을 선호함.
📌 Setter 메소드
- 외부에서 메소드에 접근하여 조건에 맞을 경우 데이터 값을 변경할 수 있도록 함.
- 데이터는 외부에서 접근하지 않도록 막고, 메소드는 공개해서 외부에서 메소드를 통해 데이터에 접근하도록 유도함.(메소드는 매개값을 검증해서 유효한 값만 데이터로 저장할 수 있기 때문)
📌 Getter
- 설정한 변수 값, 외부에서 객체의 데이터를 읽을 때 사용하는 메소드
- 경우에 따라 객체 외부에서 필드 값을 사용하기가 부적절한 경우가 발생할 수 있는데, 이러한 경우에는 값을 가공한 이후에 외부로 전달하는 역할을 함.
✨ setter 메소드를 사용하여 데이터의 값을 저장, getter 메소드를 통해 데이터 값을 불러와 변수에 담아 출력!
💻 생성자
- 생성자(Constructor)는 객체가 생성될때 자동으로 호출되는 특수 목적의 멤버함수(메소드)로 객체의 초기화를 위해 사용됨.
- 생성자의 특징
- 생성자의 이름은 클래스 이름과 동일해야 함.
- 다른 멤버함수(메소드)와는 다르게 리턴 타입이 없음.
- 객체가 생성될때 자동으로 한번 호출됨.
- 매개변수 조건에 따라 여러개를 작성할 수 있음.(오버로딩)
- 클래스에 최소 1개는 있어야 하며, 생성자 코드가 없을 경우 컴파일러가 기본생성자를 자동으로 생성함.(*생성자 코드가 1개라도 작성되어 있다면, 컴파일러는 기본생성자가 없다고 하더라도 기본생성자를 자동으로 생성하지 않음.)
📌 클래스(Class) 예제 풀이
예제 1.
public class Phone {
//phone이 가진 데이터 - 변수로 표현
String brand; //null
int price; //0
String modelName; //null
//phone이 가진 기능 - 메소드의 정의
public void powerOn(){
System.out.println("폰의 전원을 켭니다.");
}
public void poerOff(){
System.out.println("폰의 전원을 끕니다.");
}
}
//단순 코드 실행을 위한 클래스
public class PhoneTest1 {
public static void main(String[] args) {
//Phone 클래스(설계도) 대로 실체(객체)를 만들어야 함.
//객체를 생성하는 문법
//클래스명 객체명 = new 클래스명();
//new: 새로운 객체를 만들라는 명령
Phone p1 = new Phone(); //p1이라는 Phone 객체
//객체가 가진 데이터 읽기
//객체명.변수명
System.out.println(p1.brand);
System.out.println(p1.price);
System.out.println(p1.modelName);
//객체가 가진 데이터 수정
p1.brand = "삼성";
p1.price = 10000;
p1.modelName = "갤럭시";
//phone이 가진 메소드 호출
p1.powerOn();
p1.poerOff();
}
}
public class PhoneTest2 {
public static void main(String[] args) {
//객체는 여러개 생성 가능
Phone p1 = new Phone();
Phone p2 = new Phone();
p1.price = 5000;
System.out.println(p1.price);
System.out.println(p2.price);
}
}
예제 2.
- Car 클래스는 현실세계에서의 자동차를 class로 표현한 것이다. 다음 문제를 읽고 Car 클래스를 완성해 보세요.
- 자동차는 제조사, 차이름, 차량번호, 가격, 소유주의 속성을 가지고 있다. 이 속성을 가진 Car 클래스를 선언해 보세요.
- 자동차의 속성을 변경하는 메소드를 만들어보세요.
- 자동차의 속성을 출력하는 메소드를 만들고, 새로운 클래스를 만들어 7,8번에서 만든 메소드가 잘 동작되는지 확인하세요.
public class Car {
//자동차는 제조사, 차이름, 차량번호, 가격, 소유주의 속성을 가지고 있다. 이 속성을 가진 Car 클래스를 선언해 보세요.
String brand;
String carName;
String carNum;
int price;
String prop;
//자동차의 속성을 변경하는 메소드를 만들어보세요.
//setter
// - 클래스가 가진 데이터 각각의 값을 매개변수로 변경하는 메소드
// - set 데이터명으로 메소드명이 정해져있음!
public void setBrand(String brand1){
brand = brand1;
}
public void setCarName(String carName1){
carName = carName1;
}
public void setCarNum(String carNum1){
carNum = carNum1;
}
public void setPrice(int price1){
price = price1;
}
public void setProp(String prop1){
prop = prop1;
}
//모든 멤버변수를 한 번에 변경하는 메소드
public void setCarInfo(String brand1, String carName1, String carNum1, int price1, String prop1){
brand = brand1;
carName = carName1;
carNum = carNum1;
price = price1;
prop = prop1;
}
//자동차의 속성을 출력하는 메소드를 만들고, 새로운 클래스를 만들어 7,8번에서 만든 메소드가 잘 동작되는지 확인하세요.
public void showInfo(){
System.out.println("제조사 : " + brand);
System.out.println("차이름 : " + carName);
System.out.println("차량번호 : " + carNum);
System.out.println("가격 : " + price);
System.out.println("소유주 : " + prop);
}
}
public class CarTest1 {
public static void main(String[] args) {
//자동차의 속성을 출력하는 메소드를 만들고, 새로운 클래스를 만들어 7,8번에서 만든 메소드가 잘 동작되는지 확인하세요.
Car c1 = new Car();
Car c2 = new Car();
//c1 차량에 대한 정보 변경
c1.setBrand("현대");
c1.setCarName("아반떼");
c1.setCarNum("0000");
c1.setPrice(5000);
c1.setProp("김자바");
c1.showInfo();
//c2 차량에 대한 정보 변경
//메소드를 호출할 때는 메소드명이 일치! + 매개변수의 정보
//매개변수 정보: 매개변수의 개수, 매개변수의 자료형
c2.setCarInfo("기아", "k3", "2222", 10000, "이자바");
c2.showInfo();
}
}
예제 3.
- 회원정보를 관리하기 위한 Member 클래스를 아래 문제를 풀어 완성하세요.
- 회원정보로는 이름, 아이디, 비밀번호, 나이를 관리할 것이다. 이 데이터를 가지는 클래스를 만들어 보세요.
- 회원 등록을 위한 메소드를 만들어보세요.
- 등록한 회원의 정보를 확인하기 위한 메소드를 만들어 보세요.
- 회원의 이름을 변경하기 위한 메소드를 만들어보세요.
- 이름 변경이 잘 됬는지 확인하기 위한 이름 출력 메소드를 만들어보세요.
그리고 9 ~ 13번으로 클래스를 잘 구성했는지 확인하기 위해 객체를 만들어 확인하세요.
public class Student {
//데이터: 이름, 나이, 학번, 점수
String name;
int age;
String stuNum;
int score;
//기능
//매개변수로 전달된 이름값으로 name값을 변경하는 메소드 setName
public void setName(String name1){
name = name1;
}
//매개변수로 전달된 나이로 age값을 변경하는 메소드 setAge
public void setAge(int age1){
age = age1;
}
//매개변수로 전달된 나이로 stuNum값을 변경하는 메소드 setstuNum
public void setStuNum(String stuNum1){
stuNum = stuNum1;
}
//매개변수로 전달된 나이로 score값을 변경하는 메소드 setScore
public void setScore(int score1){
score = score1;
}
//기능
//1. 학생의 모든 정보를 출력하는 showInfo() 메소드 구현
public void showInfo(){
System.out.println("이름 : "+ name);
System.out.println("나이 : "+ age);
System.out.println("학번 : "+ stuNum);
System.out.println("점수 : "+ score);
}
}
public class StudentTest1 {
public static void main(String[] args) {
//학생 객체 s1 생성
Student s1 = new Student();
//학생이 가진 모든 정보를 출력
s1.showInfo();
//s1 학생이름을 홍길동으로 변경
s1.name = "홍길동";
s1.setName("홍길동");
//점수 변경
//데이터를 직접 컨트롤하면 잘못된 데이터가 들어가는
//문제가 발생했을 때 대처할 방법이 없음.
s1.score = 80;
s1.setScore(80);
}
}
예제 4.
- 아래의 문제를 풀면서 사람을 표현하는 Man 클래스를 만들어보자.
- Man 클래스는 이름, 나이, 주소를 멤버로 가지고 있다. 모든 멤버를 선언하세요.
- 멤버 모두의 값을 초기화 할 수 있는 메소드를 만드세요,
- 멤버 각각의 값을 변경하는 메소드를 3개를 만드세요.
- 각 멤버의 값을 리턴하는 메소드를 3개 만드세요.
- 멤버의 모든 정보를 출력하는 메소드를 만드세요.
- Man 클래스로 객체를 만들어 위에서 만든 메소드가 잘 작동되는지 테스트하세요.
public class Man {
String name;
int age;
String addr;
//생성자 : 클래스가 가진 변수의 값을 초기화하는 용도
//생성자는 리턴 타입이 없음. 반드시 클래스명과 동일!
//생성자는 메소드의 일종이다.
public Man(){
name = "지정되지 않음";
age = 0;
addr = "정보가 없음";
}
//모든 멤버 초기화 메소드
public void initMan(String name, int age, String addr){
this.name = name;
this.age = age;
this.addr = addr;
}
//멤버 모두의 값을 초기화 할 수 있는 메소드를 만드세요,
//this. -> 이 클래스에서 정의된
//setter -> 우클릭/ganerate/setter를 통해 빨리 생성 가능
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public void setAddr(String addr) {
this.addr = addr;
}
//각 멤버의 값을 리턴하는 메소드를 3개 만드세요.
//getter -> 우클릭/ganerate/getter를 통해 빨리 생성 가능
public String getName(){
return name;
}
public int getAge(){
return age;
}
public String getAddr() {
return addr;
}
public void printInfo(){
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("주소 : " + addr);
}
}
public class ManTest {
public static void main(String[] args) {
//객체 생성 문법
//클래스명 객체명 = new 생성자();
Man m = new Man(); //생성자는 객체를 호출할 때 한 번만 사용
//초기화: 제품이 생산되면 가장 먼저 값을 세팅하는 작업
// : 제품이 만들어지면 초기에 딱 한 번만!
//m.initMan("홍길동", 20, "울산");
m.printInfo();
}
}
예제 5.
//계좌정보
public class Account {
String owner;
int balance; //예금액
String accNumber; //1111-2222
//생성자: 멤버변수의 값을 초기화할 용도로 사용!
public Account(){
balance = 10000;
}
public Account(int money){
balance = money;
}
// public void initAcc(){
// owner = "지정 안됨";
// balance = 10000;
// accNumber = "할당 없음";
// }
//입금: 매개변수로 입금액이 들어오면 입금!
public void deposit(int money){
balance += money; // balance = balance + money;
}
//출금
public void withdraw(int money){
if(balance - money < 0){
System.out.println("잔액이 부족합니다.");
}
else {
balance = balance - money;
}
}
//계좌 정보를 확인(출력)
public void showAcc(){
System.out.println("계좌주 : " + owner);
System.out.println("계좌번호 : " + accNumber);
System.out.println("예금액 : " + balance);
}
//메소드 이름 중복될 수 있음(매개변수가 다르면)
}
public class AccountTest {
public static void main(String[] args) {
//객체 생성시 생성자가 반드시 호출되어야 함!
//만약 클래스에 생성자가 하나도 정의되어있지 않다면
//기본 생성자를 자동으로 만들어 줌.
Account acc = new Account(20000); //매개변수를 정수화하는 생성자 호출
Account acc1 = new Account(); //위에 있는 생성자를 통해 객체를 만듦
// acc.initAcc();
// acc.deposit(10000);
// acc.withdraw(5000);
acc.showAcc();
//Account[] a = new Account[10];
}
}
예제 6.
- Student 클래스를 아래의 문제를 풀면서 완성하시오.
- Student 클래스는 이름, 나이, 주소, 학번, 연락처를 멤버로 가지고 있습니다.
- 각각의 멤버를 선언하고 모든 멤버를 초기화 하는 메소드를 만드세요.
- Student 클래스에서 멤버 각각의 값을 변경하는 메소드를 만드세요.
- Student 클래스에서 각각의 멤버 값을 리턴하는 메소드를 만드세요.
- Student 클래스에 모든 멤버의 값을 출력하는 메소드를 만드세요.
public class Student2 {
//멤버
String name;
int age;
String arrd;
int stuNum;
String phnNum;
//생성자
public Student2(){
name = "정보없음";
age = 0;
arrd = "정보없음";
stuNum = 000000;
phnNum = "010-0000-0000";
}
//모든 멤버 초기화
public void initStu(){
this.name = name;
this.age = age;
this.arrd = arrd;
this.stuNum = stuNum;
this.phnNum = phnNum;
}
//멤버 각각의 값을 변경하는 메소드
public void setName(String name1){this.name = name1;}
public void setAge(int age1){this.age = age1;}
public void setArrd(String arrd1){this.arrd = arrd1;}
public void setStuNum(int stuNum1){this.stuNum = stuNum1;}
public void setPhnNum(String phnNum1){this.phnNum = phnNum1;}
//각각의 멤버 값을 리턴하는 메소드
public String getName() {
return name;
}
public int getAge() {
return age;
}
public String getArrd() {
return arrd;
}
public int getStuNum() {
return stuNum;
}
public String getPhnNum() {
return phnNum;
}
//출력
public void printStu(){
System.out.println("이름 : " + name);
System.out.println("나이 : " + age);
System.out.println("주소 : " + arrd);
System.out.println("학번 : " + stuNum);
System.out.println("연락처 : " + phnNum);
}
}
public class Student2Test {
public static void main(String[] args) {
Student2 s = new Student2();
s.printStu();
//학생 정보 변경
s.name = "이송민";
s.age = 29;
s.stuNum = 20140933;
s.printStu();
}
}
예제 7.
- Calculator 클래스를 완성하여 계산기 프로그램을 완성해보세요.
- 계산기 클래스는 정수 두 개를 멤버로 갖는다. 모든 멤버를 선언해보세요.
- 계산기 클래스는 더하기, 뺴기, 나눗셈, 곱셈 기능을 가지고 있습니다. 각각의 메소드를 통해 연산의 결과를 리턴하는 메소드를 기능별로 하나씩 만드세요.
- 계산기 클래스를 사용하는 클래스를 만들어 계산기 프로그램을 실행하여 보세요. main 메소드에서는 두 정수와 연산자를 scanner로 입력받습니다. 입력받은 연산자에 따라 더하기, 뺴기, 곱셈, 나눗셈 중 하나를 실행합니다. 실행 후 결과를 출력해보세요. 실행 결과는 아래와 같아야 합니다.
-결과-
첫 번째 수 : 10
두 번째 수 : 20
연산자 : +
10 + 20 = 30
public class Calculator {
//멤버선언
int a;
int b;
//a, b 두 값을 변경하는 메소드
public void setNumber(int a, int b){
this.a = a;
this.b = b;
}
public int sum(){
return a + b;
}
public int minus(){
return a - b;
}
public int multi(){
return a * b;
}
public double divide(){
return a / (double)b;
}
}
public class CalculatorTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
///계산기에 대한 클래스 객체 생성
Calculator calc = new Calculator();
System.out.println("첫번째 수 : ");
int num1 = sc.nextInt();
System.out.println("두번째 수 : ");
int num2 = sc.nextInt();
System.out.println("연산자 : ");
String oper = sc.next();
calc.setNumber(num1, num2);
//조건문(if, switch)
switch(oper){
case "+" :
System.out.println(num1 + " + " + num2 + " = " + calc.sum());
break;
case "-" :
System.out.println(num1 + " - " + num2 + " = " + calc.minus());
break;
case "*" :
System.out.println(num1 + " * " + num2 + " = " + calc.multi());
break;
case "/" :
System.out.println(num1 + " / " + num2 + " = " + calc.divide());
break;
default :
System.out.println("잘못 입력했습니다.");
}
}
}
🍀 회고
- 자바에서 매우 중요한 개념인 클래스에 대해 배웠고, 클래스는 객체를 정의하는 틀, 설계도의 의미로 사용되며, 이를 사용하여 여러 객체를 생성한다는 것을 알았다. 코딩을 처음 할 때 아무 개념없이 class를 만들어 사용했는데, 수업을 통해 클래스가 필드와 메소드로 구성된다는 것에 대해 다시 한 번 확인할 수 있었다.