💻 클래스(Class)
📌 클래스와 객체(인스턴스)
- 클래스 : 설계도
- 클래스를 통해 실체를 만듦-> 객체
📌 클래스의 구성요소
- 데이터(변수)와 기능(메소드)
- 생성자 : 객체 생성 시 변수에 대한 초길값을 할당
- 객체 생성문법 : 클래스명 객체명 = new 생성자();
📌 클래스의 변수와 메소드 접근 방법
- setter : 클래스에서 선언된 맴버변수 각각의 데이터를 변경하기 위해 선언하는 메소드
ex> stuName -> setStuName()
- getter : 클래스에서 선언된 맴버변수 각각의 데이터를 읽어오는(리턴) 메소드
💻 접근제한자(Access Modifier)
- 변수나 메소드 혹은 클래스에 접근할 수 있는 영역
- 클래스 및 인터페이스, 멤버의 접근을 제한하기 위해 사용되는 기능
- 클래스와 인터페이스를 다른 패키지에서 사용하지 못하도록 막을 때, 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 필드, 메소드를 사용하지 못하도록 막아야 하는 경우 등에 사용함.
📌 접근제한자 종류
- public: 외부 클래스가 자유롭게 사용할 수 있도록 함. - 변수나 메소드를 같은 프로젝트 내에서 접근 가능
- protected 접근: 같은 패키지 또는 자식 클래스에서 사용할 수 있도록 함.
- private: 단어 뜻 그대로 개인적인 것이라 외부에서 사용될 수 없도록 함. - 변수나 메소드를 선언한 클래스 내에서만 접근 가능
*위 세 가지 접근 제한자가 적용되지 않으면 default 접근 제한을 가짐
- default: 같은 패키지에 소속된 클래스에서만 사용할 수 있도록 함. - 변수나 메소드를 선언간 같은 패키지 내에서만 접근 가능

접근제한자 예제
public class Circle {
private int rad; //반지름
//생성자 앞에도 접근제한자가 있음
public Circle(){
}
//원의 넓이를 리턴하는 메소드
//3.14 * 반지름 * 반지름
public double getArea(){
return 3.14 * rad * rad;
}
//rad 값을 전달되는 매개변수로 변경하는 메소드 setter
public void setRad(int rad){
this.rad = rad < 0 ? 0 : rad;
if(rad < 0){
this.rad = 0;
}
else {
this.rad = rad;
}
}
public class CircleTest {
public static void main(String[] args) {
Circle c1 = new Circle(); //생성자
//반지름의 값을 변경
// c1.rad = 5;
// c1.setRad(5);
}
}
💻 메소드 오버로딩(method overloading)
- 같은 이름의 메소드를 중복하여 정의하는 것
- 자바에서는 원칙적으로 한 클래스 내에 같은 이름의 메소드를 둘 이상 가질 수 없음(메소드명은 중복될 수 없음) ➡️ 하지만 매개변수의 정보(개수/자료형-타입)를 다르게 하면 하나의 이름으로 메소드를 작성할 수 있다.(메소드명을 중복으로 만들 수 있다.) 메소드 오버로딩은 서로 다른 시그니처를 갖는 여러 메소드를 같은 이름으로 정의하는 것.
- 메소드 오버로딩을 사용함으로써 메소드에 사용되는 이름을 절약할 수 있음. 또한 메소드 호출 시 전달해야할 매개변수 타입, 개수에 크게 신경쓰지않고 호출할 수 있게 됨.
- 메소드 오버로딩의 대표적인 예: println() 메소드
- println() 메소드는 전달받는 매개변수의 타입에 따라 다음과 같이 다양한 원형 중에서 적절한 원형을 호출하게 됨.
메소드 오버로딩 예제
public class Printer {
int number;
//모든 클래스는 객체 생성 시 반드시 생성자가 필요하다.
//민약 클래스 안에 생성자를 하나도 구현하지 않으면
//기본 생성자를 자동으로 만들어준다.
public Printer(int a){
number = 10;
}
public Printer(int a, int b){
number = a;
}
public Printer(String a){
}
}
public class PrinterTest {
public static void main(String[] args) {
// Printer p1 = new Printer();
// System.out.println(p1.number);
//
// Printer p2 = new Printer(5);
// System.out.println(p2.number);
}
}
📌 예제 풀이
예제 1.
- Member 클래스는 필드로 이름, 아이디, 비밀번호를 갖는다. 모든 필드를 선언하고, 각 필드에 대한 setter와 getter를 만들어라.
- 모든 필드의 값을 출력하는 displayInfo() 메소드를 만들어라.
- 실행 클래스를 만들어 이름을 ‘자바’, 아이디는 ‘java’, 비밀번호는 ‘123’으로 변경하고 출력메소드를 사용하여 결과를 확인하여라.
public class Member1 {
private String name;
private String id;
private String pw;
//setter
public void setName(String name) {
this.name = name;
}
public void setId(String id) {
this.id = id;
}
public void setPw(String pw) {
this.pw = pw;
}
//getter
public String getName() {
return name;
}
public String getId() {
return id;
}
public String getPw() {
return pw;
}
public void displayInfo(){
System.out.println("이름 : " + name);
System.out.println("아이디 : " + id);
System.out.println("비밀번호 : " + pw);
}
}
public class Member1Test {
public static void main(String[] args) {
Member1 m1 = new Member1();
m1.setName("김자바");
m1.setId("java");
m1.setPw("12345");
m1.displayInfo();
}
}
예제 2.
public class Member2 {
private String name;
private String id;
private String pw;
private int age;
// public Member2(String name, String id){
// this.name = name;
// this.id = id;
// }
//setter
public void setName(String name){
this.name = name;
}
public void setId(String id){
this.id = id;
}
public void setPw(String pw){
this.pw = pw;
}
public void setAge(int age){
this.age = age;
}
//getter
public String getName(){
return name;
}
public String getId(){
return id;
}
public String getPw(){
return pw;
}
public int getAge(){
return age;
}
}
public class Member2Test {
public static void main(String[] args) {
Member2 m1 = new Member2();
m1.setName("홍길동");
m1.setId("hong");
m1.setName("강자바");
m1.setId("java");
}
}
예제 3.
public class MemberService {
public boolean login(String id, String pw){
//id가 "hong"이고, password가 "12345" 일 때 true
if(id.equals("hong") && pw.equals("12345")){
return true;
}
else {
return false;
}
//삼항연산자
//1. return id.equals("hong") && pw.equals("12345") ? true : false;
//2. return id.equals("hong") && pw.equals("12345");
}
public void logout(String id){
System.out.println("로그아웃 되었습니다.");
}
}
public class MemberServiceExample {
public static void main(String[] args) {
MemberService memberService = new MemberService();
boolean reault = memberService.login("hong", "12345");
if(reault){
System.out.println("로그인 되었습니다.");
memberService.logout("hong");
}
else{
System.out.println("id 또는 pw가 올바르지 않습니다.");
}
}
}
예제 4.
public class Stu {
String name;
int stuNum;
public void printInfo(){
System.out.println("name : " + name);
System.out.println("student number : " + stuNum);
}
}
public class School {
String schoolName;
Stu stu;
public void printSchollInfo(){
System.out.println("학교명 : " + schoolName);
stu.printInfo();
}
}
public class StuTest {
public static void main(String[] args) {
Stu s1 = new Stu();
s1.name = "김자바";
Stu s2 = s1;
System.out.println(s1.name);//김자바
System.out.println(s2.name);//김자바
s2.name = "홍길동";
System.out.println(s1.name);//홍길동
System.out.println(s2.name);//홍길동
}
}
예제 5.
- 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();
}
}
예제 6.
public class Rectangle {
private int x1, y1, x2, y2;
//기본생성자
public Rectangle(){}
public Rectangle(int x1, int y1, int x2, int y2){
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
public void set(int x1, int y1, int x2, int y2){
this.x1 = x1;
this.y1 = y1;
this.x2 = x2;
this.y2 = y2;
}
public int square(){
return (x2-x1) * (y2-y1);
}
public void show(){
//좌표: (10, 10), (20, 20)
//넓이: 30
System.out.println("좌표 : (" + x1 + ", " + y1 + "), (" + x2 + ", " + y2 + ")");
System.out.println("넓이 : " + square());
}
public boolean equalse(Rectangle r){
if(square() == r.square()){
return true;
}
else {
return false;
}
}
}
public class RectangleTest {
public static void main(String[] args) {
Rectangle r = new Rectangle();
Rectangle s = new Rectangle(1, 2, 3, 4);
r.show();
s.show();
System.out.println(s.square());
r.set(-2, 2, -1, 4);
r.show();
System.out.println(r.square());
if(r.equals(s))
System.out.println("두 사각형의 넓이는 같습니다.");
}
}
예제 7. 계산기
public class Add {
private int a;
private int b;
public void setValue(int a, int b){
this.a = a;
this.b = b;
}
public int calculate(){
return a + b;
}
}
public class Sub {
private int a;
private int b;
public void setValue(int a, int b){
this.a = a;
this.b = b;
}
public int calculate(){
return a - b;
}
}
public class Mul {
private int a;
private int b;
public void setValue(int a, int b){
this.a = a;
this.b = b;
}
public int calculate(){
return a * b;
}
}
public class Div {
private int a;
private int b;
public void setValue(int a, int b){
this.a = a;
this.b = b;
}
public int calculate(){
return a / b;
}
}
public class CalculaterTest {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("첫번째 수 : ");
int num1 = sc.nextInt();
System.out.println("두번째 수 : ");
int num2 = sc.nextInt();
System.out.println("연산자 : ");
String oper = sc.next();
switch (oper){
case "+" :
Add add = new Add();
add.setValue(num1, num2);
System.out.println(num1 + oper + num2 + " = " + add.calculate());
break;
case "-" :
Sub sub = new Sub();
sub.setValue(num1, num2);
System.out.println(num1 + oper + num2 + " = " + sub.calculate());
break;
case "*" :
Mul mul = new Mul();
mul.setValue(num1, num2);
System.out.println(num1 + oper + num2 + " = " + mul.calculate());
break;
case "/" :
Div div = new Div();
div.setValue(num1, num2);
System.out.println(num1 + oper + num2 + " = " + div.calculate());
break;
}
}
}
예제 8.
public class Monitor {
private String brand;
private int price;
private String color;
public Monitor(String brand, int price, String color) {
this.brand = brand;
this.price = price;
this.color = color;
}
public void setBrand(String brand) {
this.brand = brand;
}
public void setPrice(int price) {
this.price = price;
}
public void setColor(String color) {
this.color = color;
}
public String getBrand() {
return brand;
}
public int getPrice() {
return price;
}
public String getColor() {
return color;
}
public void showInfo(){
System.out.println("제조사 : " + brand);
System.out.println("가격 : " + price);
System.out.println("색상 : " + color);
}
}
public class MonitorTest {
public static void main(String[] args) {
//Monitor 객체 5개를 저장할 수 있는 배열 생성
Monitor[] monitors = new Monitor[5];
//배열의 각 요소에 모니터 객체를 저장
monitors[0] = new Monitor("삼성", 10000, "블랙");
monitors[1] = new Monitor("삼성", 15000, "블랙");
monitors[2] = new Monitor("엘지", 20000, "화이트");
monitors[3] = new Monitor("엘지", 15000, "화이트");
monitors[4] = new Monitor("엘지", 30000, "화이트");
//Monitor m1 = new Monitor("삼성", 10000, "블랙");
//monitors[0] = m1;
//모니터의 모든 정보를 출력
// for(int i = 0; i < monitors.length; i++){
// monitors[i].showInfo();
// }
//모니터 중에서 제조사가 삼성인 모니터들의 정보를 출력
for(int i = 0; i < monitors.length; i++){
if(monitors[i].getBrand().equals("삼성")){
monitors[i].showInfo();
}
}
//for-each문
for(Monitor monitor : monitors){
if(monitor.getBrand().equals("삼성")){
monitor.showInfo();
}
}
//모니터의 모든 가격의 총합을 출력
int sum = 0;
for(int i = 0; i < monitors.length; i++){
sum = sum + monitors[i].getPrice();
}
//가격이 20000인 모니터의 색상을 레드로 변경
for(int i = 0; i < monitors.length; i++){
if(monitors[i].getPrice() == 20000){
monitors[i].setColor("레드");
}
}
}
}
예제 9.
- 학생관리 프로그램을 만들어 보자. 학생관리 프로그램은 학생등록, 학생정보변경, 학생정보출력의 기능이 있다.(학생 최대 3명까지 가능)
- 해당 프로그램을 완성하기 위해 학생클래스와 학생관리 기능을 제공하는 클래스가 존재한다.
- 학생 클래스는 이름, 나이, 학점(A,B,C..), 연락처 정보를 가지고 있다.
- 학생관리 클래스는 학생등록, 학생정보변경(연락처), 학생정보출력의 기능이 있다.
- 추가적인 실행클래스(main메소드가 존재하는 클래스)를 만들어서 학생프로그램을 완성해보세요. 아래는 프로그램의 실행예시이다. 아래와 같이 프로그램이 실행될 수 있게 프로그램을 만들어보세요.
- 예시
학생관리 프로그램을 실행합니다.
1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료 : 1
학생 등록을 시작합니다. 학생 정보를 입력하세요.
이름 : 홍길동
나이 : 20
연락처 : 010-0000-0000
학점 : A
1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료 : 1
이름 : 장길동
나이 : 30
연락처 : 010-0000-1111
학점 : B
1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료 : 2
학생의 연락처를 변경합니다.
변경 학생 : 김자바
해당하는 학생이 존재하지 않습니다. 다시 입력하세요.
변경 학생 : 홍길동
연락처 : 010-1111-1111
변경완료되었습니다.
1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료 : 3
정보를 열람할 학생 : 김자바
해당하는 학생이 존재하지 않습니다. 다시 입력하세요.
정보를 열람할 학생 : 홍길동
요청하신 학생의 정보입니다.
이름 : 홍길동, 나이 : 20, 연락처 : 010-0000-0000, 학점 : A
1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료 : : 1
학생 등록을 시작합니다. 학생 정보를 입력하세요.
이름 : 장길동
나이 : 30
연락처 : 010-1111-1111
학점 : B
1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료 : 4
모든 학생의 정보입니다. 현재 총 학생 수는 2명입니다.
이름 : 홍길동, 나이 : 20, 학점 : A
이름 : 장길동, 나이 : 30, 학점 : B
1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료 : 5
프로그램을 종료합니다.
- 출력 결과

- student
public class Student {
private String name;
private int age;
private String grade;
private String tel;
public Student(String name, int age, String grade, String tel) {
this.name = name;
this.age = age;
this.grade = grade;
this.tel = tel;
}
public String getName() {
return name;
}
public void showInfo(){
System.out.println("이름 : " + name + ", 나이 : " + age + ", 학점 : " + grade + ", 연락처 : " + tel);
}
}
public class StudentManager {
private Student[] students; //배열 선언
private Scanner sc;
private int index; //배열의 index를 저장
//생성자
public StudentManager(){
//학생 3명이 저장될 공간 생성
students = new Student[3];
sc = new Scanner(System.in);
index = 0;
}
//학생등록
//키보드로 학생 정보를 입력받음
//입력받은 정보로 학생 객체 생성
//생성한 학생 객체를 배열에 저장
public void regStudent(){
if(index >= 3){
System.out.println("더 이상 학생을 등록할 수 없습니다.");
}
else {
System.out.println("학생 등록을 실행합니다. 학생정보를 입력하세요.");
System.out.println("이름 : ");
String name = sc.next();
System.out.println("나이 : ");
int age = sc.nextInt();
System.out.println("학년 : ");
String grade = sc.next();
System.out.println("연락처 : ");
String tel = sc.next();
//
Student stu = new Student(name, age, grade, tel);
students[index++] = stu;
}
}
//학생정보변경(연락처)
public void changeInfo(){
System.out.println("학생 정보 변경 실행");
}
//학생정보출력(1명)
public void showInfo(){
boolean isFind = false; //참 또는 거짓을 저장
while(!isFind){
System.out.println("정보를 열람할 학생 : ");
String name = sc.next();
for(int i = 0; i < index; i++){
if(students[i].getName().equals(name)){
System.out.println("요청하신 학생의 정보입니다.");
students[i].showInfo();
isFind = true;
}
}
if(!isFind){
System.out.println("해당하는 학생이 존재하지 않습니다. 다시 입력하세요.");
}
}
}
//학생정보출력(모든 학생)
//학생 한 명의 정보를 출력 기능 *학생 수만큼 반복
public void showInfoAll(){
System.out.println("모든 학생의 정보입니다. 현재 총 학생 수는 " + index + "명입니다.");
for(int i = 0; i < index ; i++){
students[i].showInfo();
}
}
}
public class Test {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
StudentManager studentManager = new StudentManager();
System.out.println("학생관리 프로그램을 실행합니다.");
while(true) {
System.out.println("1)학생등록 2)학생정보변경(연락처) 3)학생정보출력 4)모든학생정보출력 5)프로그램 종료");
int option = sc.nextInt();
switch(option){
case 1:
studentManager.regStudent();
break;
case 2:
studentManager.changeInfo();
break;
case 3:
studentManager.showInfo();
break;
case 4:
studentManager.showInfoAll();
break;
case 5:
System.out.println("프로그램을 종료합니다.");
System.exit(0); //코드 실행 시 프로그램 종료
}
}
}
}
🍀 회고
- 클래스가 완전히 다 이해되기도 전에 심화된 내용과 함께 엄청나게 많은 예제를 풀었더니 정신이 혼미하다 ... 확실하게 이해했냐고 물으면 NO...라고 답할 수 있겠다...🥲 아직 많이 어렵지만 자바 사용을 위해 정말 중요한 내용인게 느껴진다. 이해안되는 부분은 문제 풀이 소스코드라도 다시 읽어보고 있지만 한계가 있어, 다른 기술블로그와 인강을 좀 더 활용해야할 것 같다.