[STUDY] 231212 | Java | 클래스(Class), 접근제한자(Access Modifier), 메소드 오버로딩(Method overloading)

Nimgnos·2023년 12월 14일
0

👾 STUDY

목록 보기
17/40

💻 클래스(Class)

📌 클래스와 객체(인스턴스)

  • 클래스 : 설계도
  • 클래스를 통해 실체를 만듦-> 객체

📌 클래스의 구성요소

  • 데이터(변수)와 기능(메소드)
  • 생성자 : 객체 생성 시 변수에 대한 초길값을 할당
  • 객체 생성문법 : 클래스명 객체명 = new 생성자();

📌 클래스의 변수와 메소드 접근 방법

  • setter : 클래스에서 선언된 맴버변수 각각의 데이터를 변경하기 위해 선언하는 메소드
    ex> stuName -> setStuName()
  • getter : 클래스에서 선언된 맴버변수 각각의 데이터를 읽어오는(리턴) 메소드

💻 접근제한자(Access Modifier)

  • 변수나 메소드 혹은 클래스에 접근할 수 있는 영역
  • 클래스 및 인터페이스, 멤버의 접근을 제한하기 위해 사용되는 기능
    • 클래스와 인터페이스를 다른 패키지에서 사용하지 못하도록 막을 때, 객체 생성을 막기 위해 생성자를 호출하지 못하게 하거나 필드, 메소드를 사용하지 못하도록 막아야 하는 경우 등에 사용함.

📌 접근제한자 종류

  • public: 외부 클래스가 자유롭게 사용할 수 있도록 함. - 변수나 메소드를 같은 프로젝트 내에서 접근 가능
  • protected 접근: 같은 패키지 또는 자식 클래스에서 사용할 수 있도록 함.
  • private: 단어 뜻 그대로 개인적인 것이라 외부에서 사용될 수 없도록 함. - 변수나 메소드를 선언한 클래스 내에서만 접근 가능
    *위 세 가지 접근 제한자가 적용되지 않으면 default 접근 제한을 가짐
  • default: 같은 패키지에 소속된 클래스에서만 사용할 수 있도록 함. - 변수나 메소드를 선언간 같은 패키지 내에서만 접근 가능
(출처: https://hongong.hanbit.co.kr/%EC%9E%90%EB%B0%94-%EC%A0%91%EA%B7%BC-%EC%A0%9C%ED%95%9C%EC%9E%90%EC%9D%98-%EC%A2%85%EB%A5%98%EC%99%80-%EC%B0%A8%EC%9D%B4public-protected-private/)

접근제한자 예제

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.

    1. Member 클래스는 필드로 이름, 아이디, 비밀번호를 갖는다. 모든 필드를 선언하고, 각 필드에 대한 setter와 getter를 만들어라.
    1. 모든 필드의 값을 출력하는 displayInfo() 메소드를 만들어라.
    1. 실행 클래스를 만들어 이름을 ‘자바’, 아이디는 ‘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);
    }
}
  • StudentManager
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();
        }
    }
}
  • test
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...라고 답할 수 있겠다...🥲 아직 많이 어렵지만 자바 사용을 위해 정말 중요한 내용인게 느껴진다. 이해안되는 부분은 문제 풀이 소스코드라도 다시 읽어보고 있지만 한계가 있어, 다른 기술블로그와 인강을 좀 더 활용해야할 것 같다.
profile
먹고 기도하고 코딩하라

0개의 댓글