시작하기에 앞서 배열, 클래스 차이

배열 Array
같은 자료형의 서로 다른 값을 관리할 때 사용, 다른 자료형의 여러 데이터는 불가.

클래스 Class
서로 다른 타입의 데이터를 한꺼번에 관리하고자함.
클래스명은 대문자로 시작하는 여러 단어의 조합으로 만들기.
클래스에는 메인메소드가 필요없다
클래스는 설계도와 같다.

설계도 하나만 있으면 여러가지 모형을 만들 수 있다.
여기서 모형을 객체라고 하자.

클래스로부터 객체가 생성되고 객체는 클래스의 인스턴스


클래스

  1. 변수 정의
    인스턴스 변수 : 서로 다른 객체에서 서로 다른 값을 가질 수 있다
    주의할 점 : 객체 생성된 후 접근 가능
    (static 메소드 내 직접 접근 불가능)

(static)클래스 변수 : 클래스로 만들어진 모든 객체에 동일하게 사용가능

  1. 메소드 정의
    <전달값이 없는 메소드>
    void 메소드 선언
    sout 출력 코드 지정
    <전달값이 있는 메소드>
    void 메소드 선언(전달받는 타입 설정)
    sout 출력 코드 지정
    <전달값, 반환값이 있는 메소드>
    반환값 타입의 메소드 선언(전달받는 타입 설정)
    반복문 외 기타 선언
    return __;

  2. 메소드 오버로딩
    전달값의 타입,갯수가 다르고 자료형이 동일할때 사용가능
    (자료형의 타입이 다르고 전달값이 같은 타입이면 불가능)
    기존의 메소드를 정의했다면
    새로 메소드 정의하고 기존의 메소드를 호출하되 안에 값만 다르게 설정하기.


과정을 알아보자

1. 클래스에 여러 타입의 변수 생성

	//클래스(설계도)
 	String modelName;
    String resolution;
    int price;
    String color;

2. 객체 생성 후 인스턴스 변수에 접근해서 값 설정

		//객체 생성
 		BlackBox b1 = new BlackBox();
		
        //인스턴스 변수 값 설정
        b1.modelName = "까망이";
        b1.resolution = "FHD";
        b1.price = 200000;
        b1.color = "블랙";
		
       //출력
        System.out.println(b1.modelName);
        System.out.println(b1.resolution);
        System.out.println(b1.price);
        System.out.println(b1.color);

3. 클래스에 새로운 기능(메소드) 추가하기

이 기능은 모든 객체에 동일하게 업데이트 되도록 한다 (static 메소드)

	//클래스(설계도) 기능 추가
 	String modelName;
    String resolution;
    int price;
    String color;
    static boolean canAutoReport = false; //추가기능
    
    //확인
    //객체 생성하기
     BlackBox b1 = new BlackBox();
    b1.modelName = "까망이"; (인스턴스변수)
    BlackBox.canAutoReport = true; (클래스변수), (객체 생성x)
    
    //출력
     System.out.println(b1.modelName+" 자동 신고기능 "+BlackBox.canAutoReport); 

주의할 것 : 클래스변수는 "클래스이름." "클래스변수." 으로 접근 권장

4. 전달값 없는 메소드

	//클래스(설계도)-기능 추가
 	static boolean canAutoReport = false; 
    void autoReport() { 
       if (canAutoReport) { //canAutoReport==true
       System.out.println("충돌이 감지되어 자동으로 신고합니다.");
 		} else {
        System.out.println("자동 신고 기능이 지원되지 않습니다");
        }
    }
    //객체 생성 & 출력
      	BlackBox b1 = new BlackBox();
       
        b1.autoReport();
        BlackBox.canAutoReport = true; //기본값 수정
        b1.autoReport();
        

5. 전달값 있는 메소드

		//클래스(설계도) 기능 추가
 		void insertMemoryCard(int capacity) {
        System.out.println("메모리 카드가 삽입되었습니다");
        System.out.println("용량은" + capacity + "GB입니다");

    }
    //객체 생성 후 출력
    BlackBox b1 = new BlackBox();
    b1.insertMemoryCard(256);

6. 전달값, 반환값 모두 가진 메소드

		//클래스(설계도) 기능 추가
 		int getVideoFileCount(int type) {
        if (type == 1) {
            return 9;
        } else if (type == 2) {
            return 1;
        }
        return 10; //알 수 없을때
    }
    
    //객체 생성 및 출력
    BlackBox b1 = new BlackBox();
    int fileCount = b1.getVideoFileCount(1); 
    System.out.println("일반 영상 파일 수 : "+ fileCount+"개");

궁금한 점 : System.out.println("일반 영상 파일 수 : "+ getVideoFileCount( 1));하지 않고 int변수에 다시 전달받아서 출력해야하나? 그 이유는?

7. 메소드 오버로딩

		//클래스(설계도) 기능추가
		void record(boolean showDateTime, boolean showSpeed, int min){ 
        System.out.println("녹화를 시작합니다.");
        if(showDateTime==true){
            System.out.println("영상의 날짜정보가 표시됩니다.");
        }
        if(showSpeed){
            System.out.println("영상에 속도정보가 표시됩니다.");
        }
        System.out.println("영상은 "+ min+"분 단위로 기록됩니다");
    }
    
    //객체 생성 후 출력
    BlackBox b1 = new BlackBox();
    b1.record(false,false,10);
    
    //record()메소드에 저장된 값 외 기본값으로 재설정하고 싶을때
    메소드 오버로딩 사용하기
    
    void record(){ //새로 선언
        record(true,true,5); //기존 메소드 안의 값을 재설정
    }

매소드 오버로딩할때 위치가 중요한가?

8.클래스 변수 생성해보기

설계도에 추가된 static method는
서로 다른 객체 생성 후 매소드 호출 시 동일한 결과값을 제공

		//클래스(설계도) static 메소드 기능 추가
		static void callServiceCenter(){
        System.out.println("서비스 센터(1588-0000)으로 연결합니다");
        
        //객체 생성 후 출력하기 (다른 객체 동일한 결과 출력)
        BlackBox b1 = new BlackBox();
        BlackBox b2 = new BlackBox();
        
       b1.callServiceCenter();
       b2.callServiceCenter();
       BlackBox.callServiceCenter(); //권장

9.기존 인스턴스 변수와 파라미터 변수가 동일할 때

파라미터명과 인스턴스명이 동일. 인스턴스 변수 앞 this로 구분짓기

		//클래스(설계도)에 기존 인스턴스 변수의 기능 추가하기
        //전달받기 때문에 void(전달받는 타입, 전달값)
		void appendModelName(String modelName) { 
        this.modelName+=modelName; 
    } 
    
        //객체 생성 후 결과값 출력하기
        BlackBox b1 = new BlackBox();
        b1.modelName="까망이"; 
        b1.appendModelName("(최신형)");//새로 추가된 이름
        System.out.println(b1.modelName);

기존 인스턴스 변수에서 새로운 이름을 추가로 붙여넣고자 할때
객체 생성 + 기존 변수 선언 + 추가할 매소드 호출 (주의하기)

10. 생성자

생성자 오버로딩 : 일일이 변수를 선언하지 않고 기존 생성자를 오버로딩하여 값을 재설정하고 코드 간소화 할 수 있다.

생성자 메소드 오버로딩 : 기존 생성자에 만들어진 생성자 메소드도 오버로딩 할 수 있다--> this(); 이용

깨달은 것?
클래스(설계도)에서 새로 추가된 메소드가 있거나 오버로딩(생성자,메소드)를 할때 인스턴스 변수를 전달받으면 this.인스턴스변수 = 파라미터값(전달값); 을 선언하자.

	//클래스 인스턴스 변수 추가 (생성자 호출 시 출력되도록)
     	int serialNumber; 
    	static int counter = 0;
    
	//클래스(설계도) 생성자 설정 (인스턴스 변수 밑에 적기)
     BlackBox(){
        System.out.println("기본 생성자 호출");
        //생성자 메소드(기능추가)
        this.serialNumber = ++counter; 
        System.out.println("새로운 시리얼 넘버를 발급 받았습니다 : "+this.serialNumber);
    }
    
    //생성자 오버로딩
    BlackBox(String modelName, String resolution, int price, String color){
    //생성자 메소드 오버로딩
        this(); 
  
        System.out.println("사용자 정의 생성자 호출");
        
        
        this.modelName = modelName;
        this.resolution = resolution;
        this.price = price;
        this.color = color;
    }
    
	//객체생성
 	BlackBox b1 = new BlackBox();
     b1.modelName = "까망이";
     b1.price = 200000;
     b1.modelname = 
     b1.resolution = 
	 //생성자 오버로딩 활용 
        BlackBox b2 = new BlackBox("하양이","UHD",300000,"화이트");

<생성자 주의>
1. 객체가 만들어질 때 자동으로 호출되는 메소드
2. 클래스에서 인스턴스 변수 다음에 적기, 클래스명과 동일하게
3. 생성자 호출 시 새로운 기능을 추가한다면 인스턴스 변수를 이용/추가
4. 생성자 오버로딩은 객체 생성과 함께 바로 전달값 입력.

11. Getter / Setter

Getter : 값을 가지고 오는 메소드(반환값이 있다, 출력 시 )
Setter : 값을 설정하는 메소드(전달값이 있다, 선언 시)

		//클래스(설계도)
 	String getResolution(){ 
        if(resolution==null || resolution.isEmpty()){ //true 인 경우
            return "판매자에게 문의하세요";
        }
        return resolution; //else없이도 이렇게 가능한 듯.
    }
    void setResolution(String resolution){
        this.resolution = resolution;

    }
    int getPrice(){
        return price;
    }
    void setPrice(int price){ 
        if(price<100000){
            this.price = 100000;
        }
        else{
            this.price = price;
        }

    }
    
    	 //객체 선언 후 게터 세터 이용
        BlackBox b2 = new BlackBox();
        b2.setModelName("하양이");
        b2.setPrice(-5000);
        b2.setColor("화이트");

        System.out.println("가격 : "+b2.getPrice()+"원");
        System.out.println("해상도 : "+b2.getResolution());
        
        결과>
        가격 : 100000원
		해상도 : 판매자에게 문의하세요

게터와 세터를 사용하는 이유?
1. 인스턴스변수에서 정의한 결과와 다르게 다른값으로 재정의 한 경우
2. 접근제어자를 사용해서 기존의 인스턴스변수를 접근 못하는 경우
매번 예상치 못한 상황을 위해 게터.세터 매소드까지 만들어야하나?

12. AccessModifier(접근제어자)

접근제어자는 클래스(설계도)의 인스턴스 변수에 추가를 할 수 있고
클래스 안의 메소드에도 추가가 가능하다.

종류>
private : 해당 클래스 내에서만 접근 가능 ->게터/세터 이용
public : 모든 클래스에서 접근 가능
default : 같은 패키지 내에서만 접근 가능
protected : 같은 패키지 내에서 접근가능, 다른 패키지인 경우 자식클래스에서 접근 가능->상속받기

13.Package

패키지 : 프로젝트 진행 시 여러 개의 클래스로 이루어지는데 서로 연관된 클래스끼리 묶어두는 역할.

package chap_07;

	 Random random = new Random();
        System.out.println("랜덤 정수 : " + random.nextInt());//int범위 내 정수형 값 반환
        System.out.println("랜덤 정수(범위) : " + random.nextInt(10));// 0~10미만의 정수형 값 반환
        System.out.println("랜덤 실수 : " + random.nextDouble());//0.0이상 1.0미만의 실수값
        //System.out.println("랜덤 실수(범위) : " + random.nextDouble(10.0));//범위지정 불가

        //5.0 이상 10.0 미만의 실수를 뽑으려면?
        double min = 5.0;
        double max = 10.5;
        System.out.println("랜덤 실수 (범위):"+(min+(max-min)*random.nextDouble()));

        //로또 번호를 랜덤으로 뽑으려면? 1~45
        System.out.println("로또 번호 : "+ (random.nextInt(45)+1));

random 외 Java에서 제공되는 다른 패키지
Math, Scannner, StringBuilder, StringBuffer, StringTokenizer,BigInteger, BigDecimal, LocalDate, LocalTime, LocalDateTime

0개의 댓글