자바 기초(클래스)

웅평·2023년 11월 26일

자바 프로그래밍을 OOP(객체 지향 프로그래밍)이라고도 한다. 현실 세계에서도 특정 제품을 만들 때 여러 가지 부품들을 각각 만들어 하나로 조립해서 제품을 생산하듯이 프로그래밍적으로도 여러 가지 객체(Object)를 각각 만들어서 하나로 조립하는 프로그래밍 기법을 객체 지향 프로그래밍이라고 합니다. 자바에서 객체는 클래스를 통해 생성하실 수 있다.

클래스

  • 새로운 자료형(Data Type)
  • 기본 자료형 만으로는 프로그램 하기가 복잡해서
    사용자가 새로운 자료형을 만드는 것

객체 지향 프로그래밍 (Object Oriented Programming)

  • 현실세계의 모든 것을 "객체화" 할 수 있다

객체

  • 이세상을 구성하고 있는 모든 것은 객체이다.
  • 눈에 보이는 것일수도 있고 보이지 않는 개념적인 것일 수 있다
  • 각 객체는 그 객체를 구성하기 위한 여러가지 "속성"과 "동작"들로 구성되어있다
  • 자바에서는 객체를 표현하기 위해서는 그 객체를 구성하고 있는 속성과 동작을 분석하여 클래스를 만든다
    속성 : 맴버변수(클래스를 구성하고 있는)
    동작 : 맴버메소드(클래스를 구성하고 있는)

인스턴스

  • 클래스로부터 객체를 선언하는 과정를 클래스의 인스턴스화
  • 자바에서 하나의 클래스로부터 여러개의 인스턴스 생성가능

클래스 구조

필드

  • 객체 내에 값을 저장할 맴버변수
  • 클래스 내에서 선언된 위치에따라 클래스변수, 인스턴스변수, 지역변수로 구분

메소드

  • 메소드는 함수이며 객체의 행동을 구현

생성자

  • 클래스의 이름과 동일한 메소드를 생성자(constructor) 라고 한다
  • 생성자는 객체가 생성될 때 자동으로 호출되는 메소드
  • 자바에서 객체의 생성과 동시에 인스턴스 변수를 원하는 값으로 최기화할 수 있는 메소드를 생성자 라고한다

클래스 선언 및 인스턴스 생성

클래스 선언

class 클래스명{ }
public class BlackBox {
    // 인스턴스 변수들
    String name; // 모델명
    String resolution; // 해상도
    int price; // 가걱
    String color; //색
    int serialNumber; // 시리얼 번호

    static int counter = 0; // 시리얼 번호를 생성해주는 역활(초기값이 0에서 ++을 통해 증가)

    // static을 붙이면 클래스 변수라고 한다
    // 만들어지는 모든 객체에 자동이로 적용
    // 클래스 변수는 클래스이름.변수로 접근
    // 자동신고 기능
    static boolean conAutoReport = false;

    // 생성자는 인스턴스 변수 다음에 적는다
    /*BlackBox() {
        System.out.println("기본 생성자 호출");
        this.serialNumber = ++counter;
        System.out.println("새로운 시리얼 넘버를 발급받았습니다 " + this.serialNumber);
    }

    BlackBox(String name, String resolution, int price, String color) {
        this(); // 기본 생성자를 가르킨다, 기본생성자를 수행하고 아래 코드 수행

        System.out.println("사용자 정의 생성자 호출");
        this.name = name;
        this.resolution = resolution;
        this.price = price;
        this.color = color;
    }*/

    
    // 간단한 메소드
    void autoReport() {
        if (conAutoReport) {
            System.out.println("충돌이 감지되어 자동으로 신고");
        } else {
            System.out.println("신고 기능이 지원되지 않습니다");
        }
    }
}

BlackBox라는 클래스를 만들었다
내부에 필드, 생성자, 메소드를 정의하면된다
추가로 생성자와 메소드는 오버 로딩이 가능하다
생성자를 인스턴스가 있는경우와 없는 경우를 만들었다

인스턴스 생성

public class Main {
    public static void main(String[] args) {
    
        //생성자가 없는 경우
        BlackBox b1 = new BlackBox();
        
        // 인스턴스 변수에 값 저장
        b1.name = "까망";
        b1.resolution = "HD";
        b1.price = 200000;
        b1.color = "블랙";
        
        //생성자가 있는 경우
        BlackBox b2 = new BlackBox("까망", "HD", 200000, "블랙");
        
    }
}

new 연산자로 객체생성

BlackBox b1 = new BlackBox();

객체 맴버에 접근

b1.name = "까망";
  • 이 name을 객체 변수(객체 맴버)라고 한다

메소드

BlackBox클래스 안에 아래 메소드를 추가해보자

// 간단한 메소드
     void autoReport() {
        if (conAutoReport) {
            System.out.println("충돌이 감지되어 자동으로 신고");
        } else {
            System.out.println("신고 기능이 지원되지 않습니다");
        }
    }

    void insertMemoryCard(int capacity) {
        System.out.println(capacity + "GB 메모리 카드 삽입");
    }

    int getVideoFileCount(int type) {
        if (type == 1) {
            return 9;
        } else if (type == 2) {
            return 1;
        }
        return 10;
    }
public class Main {
    public static void main(String[] args) {
    // 메소드
        BlackBox b1 = new BlackBox();
        // 클래스내의 메소드 호출
        b1.autoReport();

        BlackBox.conAutoReport = true;
        b1.autoReport();

        b1.insertMemoryCard(256);

        // 일반 영상 : 1
        // 이벤트 영상 : 2
        int fileCount = b1.getVideoFileCount(1);
        System.out.println("일반 영상 파일 수 " + fileCount);

        fileCount = b1.getVideoFileCount(2);
        System.out.println("이벤트 영상 파일 수 " + fileCount);        
    }
}

객체를 생성하여 클래스의 메소드를 불러올 수 있다

메소드 오버로딩

// 날짜, 속도, 분을 나타낸다
    void record(boolean showDatetime, boolean showspeed, int min) {
        System.out.println("녹화 시작");
        if (showDatetime) {
            System.out.println("영상에 날짜 정보 표시");
        }
        if (showspeed) {
            System.out.println("영상에 속도가 표시");
        }
        System.out.println("영상 기록 단위 " + min + "분");
    }

    // record메소드가 호출될 때 기본적으로 정의된 값을 준다
    // 메소드 오버로딩
    void record() {
        record(true, true, 5);
    }

record() 메소드를 살향 했을 때 record(boolean showDatetime, boolean showspeed, int min) 메소드를 불러온다

오버로딩이란?

  • 한 클래스 내에서 비슷한 기능을 하는 동일한 이름의 메소드를 정의할 때 사용하며 선언시에는 반드시 받아오는 매개변수의 갯수를 다르게 하거나 자료형을 다르게 해줘야 한다.

객체와 인스턴스의 차이

클래스에 의해서 만들어진 객체를 인스턴스라고도 한다. BlackBox b1 = new BlackBox(); 이렇게 만들어진 b1은 객체이다 b1은 BlackBox의 인스턴스이다
인스턴스라는 말은 특정 객체(여기서는 b1)가 어떤 클래스(여기서는 BlackBox)의 객체인지를 관계 위주로 설명할 때 사용

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

  1. 추상화(abstraction)
  • 실제 세상을 프로그래밍으로 옮길 수 있게, 필요한 기능들만 가져와서 단순화
  1. 캡슐화(encapsulation)
  • 보안적인 기능에 도움을 줌, 규칙 정의, 사용 용도 명확히. 안에 있는 값을 노출하지 않음.
  1. 상속성(inheritance)
  • 부모를 지정하고, 부모의 코드를 가져다가 쓸 수 있는 것. 코드의 재사용성
  1. 다형성(polymorphism)
  • 변수가 여러 가지 모습으로 변할 수 있는 것.

접근 명시자

  • 일반적으로 클래스를 만들때에 속성(맴버변수)들은 prviate 영역에 보호
  • 동작(맴버메소드)들은 public 영역에 두오 외부로부터 접근을 허용
    private : 외부에 노출하지 않을 맴버
    prulbic : 외부에 노출할 맴버

국비학원에서 배운것과 따로 공부한 것을 정리한 것입니다

참고
나도코딩 유튜브

0개의 댓글