■ JAVA REVIEW & PRACTICE/INDIVISUAL

클래스와 관련된 용어들 이해하고 직접 코드 작성해보기

JH 2024. 8. 8. 21:51

외워야 할 용어들과 특징

 

  • class=클래스: 설계도 또는 설명서

  • field=필드: 클래스 안에 선언된 변수들 (객체의 상태)
    사람으로 비유하자면 사람이 구성할 수 있는 요소로서 정적인 명사 -> 눈, 코, 입
    여기에서 필드는 두가지로 나눠서 구성할 수 있음 
변수 값을 넣어주며 선언 변수 값을 넣어주지 않고 선언
int a = 1;
int b = 2;
int c = 3;
int a;
int b;
int c;

 

  • constructor=생성자: 클래스 안에 있는 특별한 메서드, 새로운 객체가 만들어질 때 자동으로 호출 됨

    - 위에 필드에서 설명한 것처럼 필드의 변수들을 값을 넣어주지 않고 선언한다면 두가지 방법으로 할 수 있는데
    첫째: 생성자 사용하지 않고 객체 만든 후 생성된 객체 밑에 값들을 나열해서 넣어줄 수 있음 이때 괄호는 비어있음
    둘째: 생성자를 만들어 괄호 안에 값을 직접 넣어주고 출력할 때 필드에 선언된 변수 이름들 괄호안에 불러주면됨

    첫번째 방법은 실수로 값을 설정하지 않거나 잘못된 값을 넣을 위험이 있어서 반드시 값을 설정을 안해주면 컴파일 에러가 발생하기 때문에 첫번째 방법은 비추고 두번째 방법인 생성자를 만들어 직접 괄호에 값을 넣어주는 방법을 쓰고있음. 그래야 깜빡하고 안넣을 수도 있는 일을 사전에 방지할수 있음

    - 생성자는 객체가 잘 작동하도록 처음에 필요한 준비를 해주는 일꾼이라고 생각하기(처음 만들어질 때 필요한 초기 설정)

    - 생성자를 사용할 시 Main 메서드에서 new 객체를 생성 할 때 괄호안에 값을 반드시 넣어줘야 함. 빈 괄호로는 에러가 뜸

    -정리하자면, 생성자를 사용하는 이유는 아래와 같음
    1) 객체를 만들 때 초기 상태를 보장 : 필요한 값들을 반드시 설정하게 할 수 있어서 필드를 직접 설정하면 실수할 가능성 증가
    2) 코드의 간결성 : 객체 만들 때 필요한 모든 값을 한꺼번에 설정가능, 필드를 각가 설정하는 것보다 더 간결하고 읽기 수월
    3) 코드의 일관성 : 객체를 만드는 과정이 항상 일정해져 프로그램의 다른 부분에서 동일한 클래스 사용할 때 실수 가능성 감소
    4) 복잡한 초기화가 필요할 때 : 여러 필드가 상호 의존적인 경우
//생성자를 사용하지 않는다면? 아래처럼 작성 가능하지만 깜빡할 수 있는 문제가 생김

// 1. 색을 깜빡하고 안칠할 수 있음
// 2. 바퀴를 깜빡하고 안달 수 있음

class 자동차 {
    String 색깔;
    int 바퀴수;
}

public class Main {
    public static void main(String[] args) {
        자동차 내차 = new 자동차(); // 자동차를 먼저 만들고
        내차.색깔 = "빨간색";        // 나중에 색깔을 칠하고
        내차.바퀴수 = 4;            // 바퀴를 달 수 있어.
    }
}


// 생성자를 사용하는 이유? 반드시 색깔과 바퀴를 설정하도록 할 수 있어서 빠지지 않고 잘 만들어진다는걸 보장해줘

class 자동차 {
    String 색깔;
    int 바퀴수;

    // 이게 생성자야
    자동차(String 색, int 바퀴) {
        색깔 = 색;
        바퀴수 = 바퀴;
    }
}

public class Main {
    public static void main(String[] args) {
        자동차 내차 = new 자동차("빨간색", 4); // 자동차를 만들 때 바로 색깔과 바퀴를 정해줘
    }
}

 

 

  • method=매서드: 클래스 안에 선언된 함수들 
    사람으로 비유하자면 사람이 할 수 있는 동사(행동) -> 일하다, 운동하다, 먹다
    - 함수는 리턴이 있던 없던 원래 위치로 돌아가게 되어있음
    - 함수는 이름으로 찾기 때문에 함수들이 이름이 똑같으면 절대 안됨
    - 함수 이름이 회색이면 아무도 불러주는 곳이 없다고 생각하면 됨 

  • instance == 객체 소환 == 초기화 == 생성 == 인스턴스화 한다고 말함

  • parameter=파라미터: 선언된 함수안에(괄호 안에) 있는 매개변수, 메서드가 뭘 받아야 하는지 약속하는 상자 같은 것
    즉 매개변수가 없다면 입력받을 값이 없다는 뜻

  • argument=인자: 그 상자에 실제로 넣어주는 값

  • void=반환할 것이 없음: 리턴할 값이 없으니 출력만 해줌

  • logic=논리적 흐름: 입력 값을 내가 원하는 값으로 바꾸고 계산하고 처리하는 과정 
    프로그램이라는건 크게 입력, 처리, 출력 단계로 나눌 수 있는데 이 단계가 진행되는 사이에 많은 로직, 즉 논리적 흐름들이 포함이 되는데 이렇게 입력받고 결과를 나타내어 출력해주는 일련의 과정들을 로직이라고 부름. 그래서 로직이 충돌한다고 할때 논리적 흐름이 깨진다고 말하기도함 ex) 1부터 9까지 곱한 결과를 출력해주어야 하는데 추가로 입력값을 더 받는다던지 등등

  • return=반환: 리턴을 최초로 만나면 아래 리턴이 있던 없던 무조건 강퇴당해서 호출한 곳으로 가는게 규칙
    조회만 필요할때는 보통 System.out.println(); 을 써서 출력만 해주고 값을 반환시켜줘야하면 return 함수이름; 해주면 됨

 

 

 

클래스에서 '존재한다'의 의미

 

메모리에 올라가 있다는 뜻인데 그 방법은 크게 두가지로
1) 객체를 생성하는 방법

2) static으로 만드는 방법

 

자바 개발자 90% 이상이 선호하는 방법은 1번임

클래스를 객체화 시켜서 메모리에 올림 > 스태틱을 사용해서 그 메소드를, 필수 값을 메모리에 올림

 

 

클래스 종류 중 외부에서 제안이 많은 순서 나열해보기 


private < protected < default < public

  • private      : 같은 클래스 안에서만
  • protected : default 기능 + 다른패키지에서 상속받을 경우에만 접근 가능
  • default      : 같은 패키지에서만
  • public       : 모두에게

 

 

AppleProduct 라는 클래스 만들어서 혼자 처음으로 코드를 작성해보기


선용튜터님께서 알려주신 private으로 무조건 클래스 만들어보고 private은 접근제안이 있기에

getter/setter(단축키 command + N) 를 활용해서 응용해보기

 

 

 

package PracticeMyself;

public class AppleProduct { // 클래스 선언
    private String productName; // 이 클래스 안에 있는 것들은 필드: 객체의 상태
    private int serialNumber;

    public AppleProduct(String productName, int serialNumber) { //생성자: 필드에 있는 것들을 매개변수로 받아 필드 초기화
        this.productName = productName;
        this.serialNumber = serialNumber;
    }


    public String getProductName() {
        return productName;
    }

    public void setProductName(String productName) {
        this.productName = productName;
    }

    public int getSerialNumber() {

        return serialNumber;
    }

    public void setProductName(int serialNumber) {

        this.serialNumber = serialNumber;
    }

    @Override
    public String toString() {
        return "AppleProduct{" +
                "productName='" + productName + '\'' +
                ", serialNumber=" + serialNumber +
                '}';
    }
}

 

package PracticeMyself;

public class Main {
    public static void main(String[] args) {
        AppleProduct appleProduct = new AppleProduct("아이폰 12 미니", 8874944);

        System.out.println("-----------------------------");
        System.out.println("상품명: " + appleProduct);
        System.out.println("시리얼 넘버: " + appleProduct.getSerialNumber());
        System.out.println("-----------------------------");
    }
}

 

 

코드 작성하며 배운점

 

  • toString은 객체에 있는 모든 정보를 출력할 때 씀
  • 반면에 getter/setter 는 하나씩만 출력할 때 씀

 

이 두가지는 나중에 다시 글로 자세히 설명해보기