본문 바로가기
공부/java

자바(java)의 클래스

by 샤샤샤샤 2022. 11. 28.

클래스

객체지향 프로그래밍의 특징.

모든 사물을 객체(물건)로 (추상화)모델링 하는 기법.

속성(변수, 필드)과 행동(메소드/함수)로 구분된다.

클래스 안의 변수는 맴버변수, 또는 필드라고도 하며, 클래스 안의 함수는 맴버함수라고도 부른다.

 

클래스의 선언

class (클래스 이름) 형식으로 선언한다. 첫 글자는 대문자를 사용하도록 한다.

 

클래스는 흔히들 붕어빵 틀에 비유한다. 클래스를 만들어두면, 같은 일을 수행하는 객체(붕어빵)을 얼마든지 만들어 낼 수 있기 때문이다. 즉, 클래스 역시 static을 사용하지 않는 이상 호출되지 않는다.

클래스를 사용하기 위해서는 따로 객체를 만들어서 호출해야 한다.

 

//클래스 class
//객체지향프로그래밍(Object Oriented Programming)
//모든 사물을 객체(물건)로 추상화(모델링)하여 프로그래밍하는 기법
//자동차라는 사물을 소프트웨어 모델딩을 해보자.
//속성(변수와 필드)과 행동(메소드/함수)으로 구분한다.

//클래스 선언부 - 자동호출(수행)되지 않는다.
//class 예약어 : 클래스 정의할 때 사용
//class 이름 : 첫글자는 영대문자로 쓴다.
class Car{
    //속성 = 변수(필드) = 멤버변수(클래스안에 있으면)
    int price = 1000;
    //행동(동작) = 메소드(함수) = 멤버함수
    void run(){
        System.out.println("달린다.");
    }
}
public class ex72 {
    public static void main(String[] args) {
        //클래스를 객체(인스턴스)로 만들어줌.
        //클래스 선언 - 코드로 존재, 클래스 객체화 - 코드를 메모리 적재한다.
        //클래스 선언 - 붕어빵 틀, 객체 - 붕어빵
        //new : 객체생성 예약어
        //클래스이름 객체이름 = new 클래스이름(=생성자함수)()
        Car objCar = new Car();

        //객체를 호출(사용)한다.
        //멤버변수에 접근(Read/Write)하려면 객체이름 뒤에 .점으로 접근
        System.out.println( objCar.price );
        //멤버함수에 접근하려면 객체이름 뒤에 .점을 찍는다.
        objCar.run();
        //System.out.println( objCar.run() ); 반환값이 void이므로 에러!

        //객체지향 프로그램밍이란?
        //  -> 클래스 지향 프로그래밍으로 말해도 됨.
        //  -> 모든 사물을 클래스로 설계하자!
    }
}
//연습문제 49 - 클래스 설계
// 카페를 클래스로 설계해보자
// 클래스이름 : Cafe
// 속성 : menuCount     메뉴갯수는 10개
// 행동 : sale          출력값은 "커피를 판다"
//클래스를 설계하고, 객체를 생성해서 속성값을 출력하고,
//  행동을 실행시켜보자.
class Cafe{
    int menuCount = 10;
    void sale(){
        System.out.println("커피를 판다.");
    }
}
//연습문제 50 - 클래스 설계
// 당근농장을 클래스로 설계해 보자
// 클래스이름 : Farm
// 속성 : carrot 당근의 갯수 초기값은 0
// 행동 : plant() 호출시마다 당근을 하나씩 생산하고,
//       속성 carrot++를 해준다.
//       호출시 "당근을 1개 생산했습니다." 출력한다.
// 당근을 plant()함수를 이용하여 5개 생산한 후 당근 갯수를
// 출력하시오.
class Farm {
    int carrot = 0; //멤버변수
    void plant(){
        int carrot = 0; //지역변수
        this.carrot++; //this는 자신의 클래스(객체)를 의미.
        System.out.println("당근을 1개 생산했습니다.");
    }
}
public class ex73 {
    public static void main(String[] args) {
        Cafe objCafe = new Cafe(); //객체생성
        System.out.println( objCafe.menuCount ); //멤버변수 읽기
        objCafe.sale(); //멤버함수 호출

        Farm objFarm = new Farm();
        objFarm.plant();
        objFarm.plant();
        objFarm.plant();
        objFarm.plant();
        objFarm.plant();
        System.out.println( objFarm.carrot );

        objFarm.carrot++; //누구나 자원(변수)을 접근하는게
        objFarm.carrot++; //좋은 설계가 아니다.
        objFarm.carrot++; //Get/Set함수를 통해서만 접근
        objFarm.carrot++; //캡슐화(은닉)의 기본개념.
        objFarm.carrot++;
        System.out.println( objFarm.carrot );
    }
}

static : 정적 변수(객체) / 함수를 지정할때 사용. 이를 사용하면 프로그램 구동시부터 종료시까지 계속 고정된 메모리                      주소값을 할당받고 있는다. 

   장점: new를 통한 객체 생성을 안해도 된다.

            데이터를 안정적으로 저장하고 다룰수 있다.

            자주 사용하는 클래스를 일일이 불러오지 않아도 된다.

   단점 : 메모리를 상시 사용한다.

예시)

class FoodFactory {
    static intfoodCount= 200;
    static void make(){
foodCount++;
        System.out.println("도시락 만들기");
    }
}
public class ex74 {
    public static void main(String[] args) {
 System.out.println( FoodFactory.foodCount);
        FoodFactory.make();              // 따로 객체 생성을 안해도 됨.
    }
}
// static 변수/함수에 대해서 - 클래스안에서
// static 예약어 : 정적 변수(객체)/함수를 지정할 때 사용
// 의미 : 프로그램 구동시에 고정된 메모리 번지에 들어감(Load).
//       프로그램 종료시까지 번지값이 바뀔지 않음.
//       static 변수/함수는 종료시까지 소멸되지 않음.
// 장점 : 1. new 안해도 바로 사용가능
//       2. 데이타를 안정적으로 저장하거나 사용할 수 있음.
//       3. 자주 사용하는 유틸성 클래스(예)Math)에 사용함.
//          Math.max(10, 20);

// 축구공공장
class BallFactory {
    int ballCount = 100;
    void make() {
        this.ballCount++;
        System.out.println("축구공 만들기");
    }
}
// 식품공장
class FoodFactory {
    static intfoodCount= 200;
    static void make(){
foodCount++;
        System.out.println("도시락 만들기");
    }
}
public class ex74 {
    public static void main(String[] args) {
        BallFactory objBall = new BallFactory();
        System.out.println( objBall.ballCount );
        objBall.make();
        //스태틱 변수/함수는 new를 통해 객체를 생성하지 않더라도,
        //프로그램 구동시에 이미 고정된 번지수에 객체 할당(적재)이 되어있음.
        //그래서 클래스이름 뒤에 점 찍고 그냥 사용해도 됨.
        System.out.println( FoodFactory.foodCount);
        FoodFactory.make();
    }
}

 

접근제한자 4가지

1. public : 모든 클래스 (파일)에서 접근 가능.

2. protected : 같은 패키지의 클래스 접근 가능

                      상속관계 클래스 접근 가능. 하위 클래스에서 상위 클래스 접근 가능

3. default : 따로 설정하지 않았을때 자동으로 적용되는 기본값.

                  같은 폴더(패키지)에서 접근 가능

4. private : 같은 클래스 안에서만 접근 가능. 캡슐화(은닉화)에 적합함.

                   Get/Set 함수를 통해서만 접근.

 

패키지 (package): 폴더와 거의 같은 의미. 폴더의 경로를 클래스로 구분하는 용도로 사용

용도: 클래스 이름이 동일한 서로 다른 클래스들을 구분하기 위함

예) 바탕화면의 '새폴더'와 D드라이브의 '새폴더'는 다르다.

     한양사는 김서방과 인천사는 김서방은 다르다.

class Hong {
    String name = "홍길동"; //디폴트 : 같은 폴더 + 자기클래스
    public int age = 30;   //퍼블릭 : 모든 폴더 + 상속관계 + 같은폴더 + 자기클래스
    protected int korScore = 80; //프로텍티드 : 상속관계 + 같은폴더 + 자기클래스
    private int engScore = 70; //프라이빗 : 자기클래스
    }

주목할건 private 다. 이는 Get/Set 함수를 통해서만 접근이 가능하다.

Getter 함수는 getHong 와 같은 식으로 클래스 이름에 get만 붙이면 된다. Setter도 마찬가지다.

  public int getEngScore() {
        return engScore;
    }
    public void setEngScore(int engScore) {  // 매개변수 engScore와 Hong클래스의 engScore는 다르다
        this.engScore = engScore;  // Hong 클래스의 engScore인것을 알려줌. 
    }

Getter함수는 private설정된 값을 불러오는 함수, Setter함수는 새롭게 값을 할당하는 함수다.

private로 설정된 값을 수정하고 싶다면, Setter 함수를 이용해야만 하는 것이다.

이때 Setter함수로 불러와서 받는 매개변수와, 기존 클래스의 매개변수는 전혀 다른 값이기에, 이를 재설정하기 위해서는 this함수를 이용해 해당 클래스의 값이라는 것을 설정해줘야만 한다.

//접근제한자 4가지
//접근제한자 : 클래스, 함수, 변수 앞에 위치하여, 접근하는
//           권한을 제어할 때 사용함.
//public : 모든 클래스(파일)에서 접근 가능
//protected : 같은 폴더(패키지)에 클래스 + 상속관계의 클래스는 접근가능
//            자식클래스(하위)에서 부모클래스(상위) 접근 가능
//default(기입 안했을때) : 같은 폴더(패키지)에서 접근 가능
//private : 같은 클래스 안에서만 접근 가능 - 캡슐화(은닉)에 적합함.
//          Get/Set함수를 통해서 접근

//패키지(package) : 폴더와 거의 같은 의미
//               : 폴더의 경로로 클래스를 구분하는 용도로 사용.
// src\Member.java Member클래스 : 패키지명은 src.Member
// src\member\Member.java Member클래스는 생성 가능 : src.member.Member
// 용도 : 폴더경로로 클래스이름이 동일한 클래스를 구분하기 위해서
// 예) 한양사는 김서방, 인천사는 김서방

// 1세대언어처럼 모두 public이면, 프로그램 수정과 유지보수가 어렵다.
// public > protected > default > private
class Hong {
    String name = "홍길동"; //디폴트 : 같은 폴더 + 자기클래스
    public int age = 30;   //퍼블릭 : 모든 폴더 + 상속관계 + 같은폴더 + 자기클래스
    protected int korScore = 80; //프로텍티드 : 상속관계 + 같은폴더 + 자기클래스
    private int engScore = 70; //프라이빗 : 자기클래스

    //private은 Get/Set함수를 통해서 접근가능
    //Getter함수는 get으로 시작하고 변수이름를 합쳐서 만듦. 변수첫글자는 대문자.
    public int getEngScore() {
        return engScore;
    }
    public void setEngScore(int engScore) {
        this.engScore = engScore;
    }
}

public class ex75 {
    public static void main(String[] args) {
        Hong obj = new Hong();
        //System.out.println( obj.engScore ); //접근 불가!
        System.out.println( obj.getEngScore() );
        obj.setEngScore( 90 );
        System.out.println( obj.getEngScore() );
    }
}
//연습문제 51 - 클래스 Getter/Setter 설계
// 책상(Desk)을 클래스로 설계해보자.
// 속성 : price 가격은 1000으로 초기화한다.
//       접근권한 private으로
// 행동 : Getter/Setter 함수를 만들어보자.
// 출력값 : price을 2000으로 바꾸고 가격을 출력하시오.
// Getter/Setter자동생성 : 우클릭->생성->Getter 및 Setter
class Desk{
    private int price = 1000;
    public int getPrice() {
        return price;
    }
    public void setPrice(int price) {
        //this 예약어 : 자기클래스를 의미
        //super 예약어 : 부모클래스를 의미
        //this.price : 멤버변수 price를 가리킴
        //price : 매개변수(지역변수) price를 가리킴
        this.price = price;
    }
}
public class ex76 {
    public static void main(String[] args) {
        Desk objDesk = new Desk();
        System.out.println( objDesk.getPrice() );
        objDesk.setPrice( 2000 );
        System.out.println( objDesk.getPrice() );
    }
}

 

 

클래스의 중요 개념들

1. 상속 : 모듈화/ 계층화, 중복제거

2. 생성자 함수 : 객체 생성시 자동으로 호출되는 함수

3. 다형성 : 만약 B클래스가 A클래스를 상속했다면, b타입, a타입 두개 모두 타입으로 가질 수 있다.

4. 추상화 클래스 : 일반클래스(일반 함수) + 가상함수

5. 인터페이스 : 인터페이스 타입에 가상함수만 있는 것

 

클래스 객체 배열

클랫스 역시 하나의 타입이라고 생각할수 있다.

그리고 그 역시 배열처럼 for문을 이용해 나열할수 있다.

//클래스-객체 배열
class Snack {
    String name = "새우깡";
    public Snack(String name) {
        this.name = name;
    }
}

public class ex86 {
    public static void main(String[] args) {
        //정수형 1차배열을 만들어 보자
        int[] nums = new int[5];
        //객체 배열을 만들어 보자.
        Snack[] snacks = new Snack[5];
        snacks[0] = new Snack("짱구");
        snacks[1] = new Snack("포카칩");
        snacks[2] = new Snack("허니버터칩");
        snacks[3] = new Snack("프링글스");
        snacks[4] = new Snack("엄마손쿠키");

        //향상된 for문
        //for( int num : nums )
        for( Snack snack : snacks ){
            System.out.println( snack.name );
        }

    }
}

'공부 > java' 카테고리의 다른 글

13일차  (0) 2022.11.30
자바(java)의 객체의 다형성  (0) 2022.11.29
자바(java)의 함수 종류  (0) 2022.11.25
자바(java) 문제 풀이 복습  (0) 2022.11.25
자바(java)의 최대, 최솟값 찾기  (0) 2022.11.23