클래스(1) + 변수잡기 연습

부트캠프(END)/Java|2022. 5. 23. 17:53

클래스?

클래스란 "객체를 정의해 놓은 것"으로, 해당 객체가 가져야 하는 기능과 속성을 정의한다. (=설계도)

다시 말해, 객체를 생성하는 데에 클래스가 사용되고 객체는 클래스에 정의된 대로 생성된다.

어떤 클래스로부터 만들어진 객체를 그 클래스의 인스턴스(instance)라고 한다.

 

클래스를 사용하는 이유

학생에 대한 정보를 관리한다고 했을 때,

학번, 이름, 생년월일 등 다양한 데이터타입으로 이루어진 정보들이 있다고 하자.

int studentNo, String studentName, String studentBirth 등 각각의 배열로 저장하기보다는,

Student라는 하나의 클래스를 만들어 각 학생별로 고유한 메모리에 해당 학생의 정보를 저장하는 것이 좀 더 효율적이다.

새로운 학생을 추가할 때마다 어떤 변수를 넣어 주어야 할 지 고민할 필요도 없어진다!

→ 클래스는 어떤 객체와 관련된 데이터와 메서드를 편하게 모아서 저장하고 관리하기 위해 사용한다.

 

또한 클래스는 객체를 생성하는 데에 필요할 뿐 객체 자체는 아니다.

따라서 메모리에 새로운 객체를 생성할 땐 반드시 생성자를 사용하여 데이터를 저장할 공간을 만들어준다!

이 때, 생성자는 반드시 클래스명과 동일해야 하며 대소문자를 구분한다.

package day16;

import java.util.Scanner;

class Music {
    int rank;
    String title;
    String artist;
    String album;
    String state;
    int modify;
}

public class OOPEx2 {
    static void musicDataInput(Music[] m) {
        for (int i = 0; i < m.length; i++) {
            m[i] = new Music();
            m[i].rank = i + 1;
            m[i].title = MusicDB.title[i];
            m[i].artist = MusicDB.artist[i];
            m[i].album = MusicDB.album[i];
            m[i].state = MusicDB.state[i];
            m[i].modify = MusicDB.modify[i];

        }
    }

    //목록 출력->가수명->페이지 나누기
    //사용자가 페이지를 요청하면 해당되는 페이지를 보여주도록 만든다.
    static void musicList(int page) {

        int j = 0; //출력항목을 10개씩 나눠주는데 사용된다.
        int pageCnt = (page * 10) - 10;
        /*
         * pageCnt는 0, 10, 20,...
         * 1페이지에는 0번째 항목부터 9번째, 2페이지는 10~19...
         * 즉, 2페이지일때는 index가 10 이상인 것부터 10개 출력한다.
         */
        for (int i = 0; i < MusicDB.title.length; i++) {
            //다른 클래스에 저장된 데이터를 참조할 수 있다.
            if (j < 10 && i >= pageCnt) {
                String s = "";
                if (MusicDB.state[i].equals("상승")) {
                    s = "↑";
                } else if (MusicDB.state[i].equals("하강")) {
                    s = "↓";
                } else {
                    s = "-";
                }
                System.out.println("--------------");
                System.out.println((i + 1) + "위" + s);
                System.out.println("title:" + MusicDB.title[i]);
                System.out.println("artist:" + MusicDB.artist[i]);
                System.out.println("album:" + MusicDB.album[i]);

                j++;
            }
        }
    }
    public static void main(String[] args) {
        Music[] music = new Music[50];
        musicDataInput(music);
        Scanner scan = new Scanner(System.in);
        int totalPage = (int)(Math.ceil(MusicDB.title.length / 10.0));
        System.out.print("insert page:(1~" + totalPage + ")");
        int page = scan.nextInt();
        musicList(page);
    }

}

 

 

클래스 연습 겸...

특정 사이트의 화면을 보고 데이터를 어떻게 관리할 지 클래스 멤버변수를 잡아보는 과제가 주어졌다.

망고플레이트 - 믿고 보는 맛집 리스트 & 맛집 정보

package day16;

class Category {
	int categoryID;
	String title;
	String poster;
	String description;
}

class Store { 
	int categoryID;
	int storeID;
	String storeName;
	String[] poster; //음식사진
	String addressRoad; //도로명주소
	String addressLand; //지번주소
	String phone; //연락처
	String foodCategory; //음식 종류
	String budget; //가격대
	String openTime; //영업시간
	String website;
	String[] menu; //메뉴
	int[] price; //가격
	Boolean parking; //주차가능여부
	double review; //평점
}
public class MangoPlateEx {

	public static void main(String[] args) {

	}

}

음식사진 poster의 경우 배열로 잡아주기보다는 String으로 잡고 [.jpg^~.jpg]등의 정규식으로 구분해주는 것이 더 편리하다.

왜? → 식당별로 몇 개의 사진을 올리느냐가 다를 수 있으므로...

같은 이유로 메뉴, 가격 등도 각각의 String[]배열보다는 하나의 String으로 잡고 그 안에서 구분하는 게 더 나음..

만개의레시피 - 레시피 화면

package day16;

class Recipe {
	int recipeNo;
	String writer; //작성자
	String writerPhoto; //작성자 프로필사진
	String photo; //메인사진
	String title; //레시피 제목
	String description; //레시피 설명
	int servings; //몇인분?
	int leadTime; //소요시간
	int level; //조리난이도
	String[] ingredients; //재료
	String[] steps; //조리방법
	String[] stepPhotos; //조리방법 사진
}
public class Recipe10000 {

	public static void main(String[] args) {
	}

}

이것도.. 조리방법, 재료, 사진 등 굳이 배열로 잡아 줄 필요는 없겠네요^.^;

 

↓아래 개념은 추후에 더 자세히

더보기

객체지향의 3대 요소

- 캡슐화 / 은닉화 -> 데이터가 변경되거나 없어지지 않도록 보호 -> 변수와 관련됨

- 상속 / 포함 -> 클래스의 재사용(변경 없이(포함) 또는 변경해서(상속) 사용가능)을 목적으로 이용됨 -> 클래스 자체와 관련

- 다형성 -> 메서드와 관련됨

-> 오버로딩 : new(새로운 기능을 추가)

-> 오버라이딩 : modify(기존의 기능을 바꿔주는 것)

=> 유지보수(재사용, 기능 첨부, 기능 변경)

 재사용 : 신뢰성이 좋다(기존에 사용하고 있기 때문에 검증이 완료되었고, 개발 시간을 줄일 수 있음)

 

 

클래스의 구성요소

1. 변수

  1.1. 공유 변수

  1.2. 인스턴스 변수

  1.3. 지역 변수

2. 메서드

  2.1. 공유 메서드

  2.2. 인스턴스 메서드

3. 초기화(변수)

  3.1. 생성자

  3.2. 초기화 블록

    3.2.1. 인스턴스 블록

    3.2.2. 정적(static) 블록

 

확장과 재사용

extends => 상속(단일 상속)

포함 : 있는 그대로 사용(스프링) -> 모두 독립적인 클래스로 사용함(POJO***)

 

클래스의 수정, 추가를 통해 다형성 구현(오버라이딩/오버로딩)

 

접근지정어(접근범위 지정)

private, protected, default, public

-> option : static, abstract, final

 

클래스의 종류

1. 일반 클래스

2. 추상 클래스

3. 인터페이스 -> 추상 클래스를 보완, 다중상속이 가능

4. 내부 클래스 -> 클래스와 클래스간 공유하는 데이터

  4.1. 멤버 클래스

  4.2. 익명 클래스

  4.3. 지역 클래스

 

'부트캠프(END) > Java' 카테고리의 다른 글

클래스(2) : 클래스의 구성 요소 / 변수  (0) 2022.05.24
메서드(5) : call by ***  (0) 2022.05.20
메서드(4) : 실습, 지역변수  (0) 2022.05.19

댓글()