728x90
반응형
728x90
모델 

 ✔  클래스를 역할에 따라 부르는 이름

현실 세계에서는 다양한 객체들이 존재하고, 그 객체들은 자신의 역할이 있는데, 역할이 정해져있다는 의미로
객체를 설계할 때는 모델을 만든다라고 합니다. 모델이라 함은 역할에 따라 전부 구분되어져 부르는 이름이라고 생각하면 됩니다.

💡  클래스 = 모델을 설계하는 도구

시작 클래스 (main)

DTO(Data Transfe Object), VO(Value Object) Model : 데이터를 담는 (이동) 모델 / 데이터를 하나로 수집하는 역할 !

  • DTO : 주로 데이터베이스로부터 데이터를 검색하거나 데이터를 저장하기 위해 사용됩니다.
  • DTO는 데이터를 저장하는 속성(멤버 변수)과 해당 데이터에 접근하기 위한 getter 및 setter 메서드를 가지고 있습니다.
  • DTO는 일반적으로 데이터베이스로부터 데이터를 검색하여 그 결과를 전달하거나, 클라이언트와 서버 간의 데이터 교환에 사용됩니다.
    주로 데이터베이스의 레코드나 특정 도메인 객체의 필드를 담고 있는 단순한 데이터 구조로 구성됩니다. DTO는 주로 읽기 전용이며, 데이터를 보관하고 전달하기 위한 목적으로 사용됩니다.

💡 DTO는 일반적으로 다음과 같은 특징을 가지고 있습니다

  1. 데이터 전달: DTO는 데이터를 전송하거나 전달하기 위한 목적으로 사용됩니다.
    예를 들어, 데이터베이스의 결과를 클라이언트에 전달하거나, 클라이언트에서 서버로 데이터를 전송할 때 DTO를 사용할 수 있습니다.
  2. 필드와 접근 메서드: DTO는 데이터 구조를 나타내기 위해 필드(field)를 가지고 있습니다. 일반적으로 필드는 데이터를 저장하거나 조회하는 용도로 사용됩니다.
    또한 필요에 따라 접근자(getter)와 설정자(setter) 메서드를 제공하여 필드에 접근할 수 있도록 합니다.
  3. 직렬화(Serialization): DTO는 데이터 전송을 위해 직렬화(serialization)될 수 있습니다.
    직렬화는 객체를 바이트 스트림 등의 형태로 변환하여 저장하거나 네트워크 상에서 전송할 수 있도록 하는 과정을 의미합니다. DTO는 주로 네트워크 통신이나 분산 시스템에서 사용되므로 직렬화가 필요할 수 있습니다.
  • DTO는 비즈니스 로직을 담지 않고, 순수한 데이터를 전달하는 목적으로 사용됩니다.
    따라서 DTO는 보통 속성(필드)과 그에 대한 접근자(getter)와 설정자(setter) 메서드를 가지는 간단한 데이터 구조로 구성됩니다. DTO는 데이터의 일관성과 효율성을 유지하며, 객체 간의 데이터 전달을 간편하게 만들어 줍니다.

 

 

 

 

DAO(Data Access Object) Model : 데이터를 처리(DB)를 하는 모델

- DAO : 데이터베이스에 데이터(VO, DTO)를 저장, 수정하거나 검색, 삭제를 하기 위해서 만들어지는 모델(클래스) 
   해당 역할을 하는것이 DAO 클래스 - CRUD 동작을 가지고 있는 클래스, 비즈니스 로직을 처리하는 클래스

   

     1) 수집된 데이터를 데이터 베이스에 저장 : insert 수정 : update
     2) 데이터베이스에 저장된 데이터를 검색 : select 삭제 : delete CRUD
         동작을 통해 DB와 서로 데이터를 주고받을 수 있다

 

💡 SQL은 Structured Query Language (구조적 질의 언어)로 관계형 데이터베이스 시스템에서 자료를 관리 및 처리하기 위해 설계된 언어이다.

DAO를 만들 때 저장 , 수정, 검색, 삭제 기능을 만들 때 SQL 명령문을 이용해서 만들 수 있다. 명령문을 이용해 DB를 제어할 수 있다.
DAO는 "Data Access Object"의 약어로, 데이터베이스와의 상호작용을 담당하는 객체를 말합니다. DAO는 데이터베이스에 접근하여 데이터를 조회, 삽입, 수정, 삭제 등의 데이터 조작 작업을 수행하는 역할을 담당합니다.
DAO는 일반적으로 데이터베이스에 대한 접근을 추상화하고, 비즈니스 로직과 데이터베이스 로직의 분리를 지원합니다.
이를 통해 애플리케이션의 유지 보수성과 확장성을 향상시킬 수 있습니다.
DAO는 데이터베이스에 직접적인 접근을 처리하므로, 데이터베이스 종류에 따라 다른 DAO 구현체를 작성해야 할 수도 있습니다.
일반적으로 DAO는 CRUD(Create, Read, Update, Delete) 작업을 수행하는 메서드를 포함합니다.
이를 통해 데이터베이스와 상호작용하면서 애플리케이션의 데이터 관리를 담당합니다.
DAO는 데이터베이스 연결, SQL 문 실행, 결과 처리 등을 담당하며, 비즈니스 로직에서는 DAO를 사용하여 데이터를 조작하고 처리합니다.

 


        import java.util.Scanner;

        public class CarInsertTest {
            public static void main(String[] args) {
                //자동차 정보를 키보드로부터 입력을 받아서 데이터 베이스에 저장을 해라.
                Scanner scan = new Scanner(System.in);
                System.out.print("자동차의 일련번호를 입력해주세요 = ");
                int carSN = scan.nextInt();
                scan.nextLine();

                System.out.print("자동차의 이름을 입력해주세요 = ");
                String carName = scan.nextLine();

                System.out.print("자동차의 가격을 입력해주세요 = ");
                int carPrice = scan.nextInt();
                scan.nextLine();

                System.out.print("자동차의 소유자의 이름을 입력해주세요 = ");
                String carOwner = scan.nextLine();

                System.out.print("자동차의 연식을 입력해주세요 = ");
                int carYear = scan.nextInt();

                scan.nextLine();

                System.out.print("자동차의 타입을 입력해주세요 = ");
                String carFlue = scan.nextLine();


                CarDTO car = new CarDTO();
                car.carSN = carSN;
                car.carName = carName;
                car.carPrice = carPrice;
                car.carOwner = carOwner;
                car.carYear = carYear;
                car.carFlue = carFlue;

                CarDAO carDAO = new CarDAO();
                carDAO.carInsert(car);
                carDAO.carSelect();

            }

 

carDAO.carInsert(car)에서 매개변수로 car를 입력하는 이유는 carInsert() 메서드의 시그니처에 맞게 데이터를 전달하기 위해서입니다.
carInsert() 메서드는 CarDTO 객체를 매개변수로 받아서 해당 객체에 저장된 자동차 정보를 데이터베이스에 저장하는 역할을 수행합니다.
따라서 carDAO.carInsert(car)는 입력받은 자동차 정보를 car 객체에 저장한 후, car 객체를 carInsert() 메서드에 전달하여 데이터베이스에 저장합니다.
반면에 carDAO.carSelect()는 매개변수를 입력하지 않는 이유는 해당 메서드에서는 데이터베이스로부터 자동차 정보를 조회하는 기능만을 수행하기 때문입니다.
자동차 정보를 조회하는 데에는 별다른 매개변수가 필요하지 않기 때문에 carDAO.carSelect()처럼 매개변수를 입력하지 않습니다.

Utility Model : 도움(Utility)을 주는 모델

  • Utility : 반복적으로 사용해야 될 동작(기능)을 별도의 클래스로 만들어놓고 필요할 때 사용하는 클래스 / 꼭 필요한 것은 아니고, 필요하면 만들어서 사용하면 됩니다.

    Utility 모델은 다음과 같은 특징을 가지고 있습니다:
    1. 정적 메서드: Utility 클래스의 메서드는 일반적으로 정적(static)으로 선언됩니다. 이는 객체의 인스턴스 생성 없이 직접 클래스 이름을 통해 메서드에 접근할 수 있다는 의미입니다.
    2. 인스턴스화 불가능: Utility 클래스는 주로 유틸리티 함수를 제공하기 위한 목적으로 사용되므로, 인스턴스화할 필요가 없습니다. 따라서 일반적으로 생성자는 private으로 선언하여 인스턴스화를 방지합니다.
    3. 공통 기능 제공: Utility 클래스는 일반적으로 다양한 클래스나 모듈에서 공통으로 사용되는 기능들을 제공합니다. 예를 들어, 문자열 처리, 날짜 및 시간 계산, 파일 조작 등과 같은 작업을 수행할 수 있는 메서드들이 Utility 클래스에 포함될 수 있습니다.

  • Utility 모델의 주요 목적은 코드의 재사용성과 유지보수성을 향상시키는 것입니다. 반복적이고 공통적인 작업들을 유틸리티 함수로 추상화하여 중복 코드를 피하고, 코드를 모듈화하여 관리하기 쉽게 만듭니다.
    또한 Utility 클래스는 객체 지향 프로그래밍에서 정적 메서드를 통해 유틸리티 함수를 호출하기 때문에, 호출하는 코드가 간결해지고 사용하기 쉬워집니다.

  • 주의할 점은 Utility 클래스가 지나치게 많은 역할과 책임을 가지지 않도록 하는 것입니다.
    즉, 단일 책임 원칙을 지키기 위해 너무 많은 기능을 Utility 클래스에 넣지 않는 것이 좋습니다.
    작은 범위의 관련된 유틸리티 함수들을 포함하는 작은 클래스들을 만들고,
    필요한 유틸리티 함수를 필요한 곳에서 적절히 활용하는 것이 바람직합니다.
    Utility 모델은 주로 간단한 독립적인 메서드들의 집합으로 구성되며, 특정한 작업을 수행하기 위한 유틸리티(도구) 함수를 제공하는 클래스입니다.
728x90
반응형
728x90

그동안 int, float, char , boolean 등 기본자료형 또는 사용자 정의 자료형이지만 자주 쓰이는 String 등을
중심으로 기본적인 구조를 공부했지만 이제 사용자 정의 자료형에 대해서 좀 더 학습해보겠습니다.

 

💡 클래스 = 모델을 설계하는 도구

 

 

 

 

 

사용자 정의 자료형의 이해

각각의 데이터에 알맞은 타입을 작성해줌으로써 변수를 선언할 수 있음을 명심해야합니다. 선언이 되지 않으면,
메모리에 만들어 질 수 없기 때문에 자료형이 중요합니다.
사용자 정의 자료형은 class 라는 도구로 설계가 가능(모델링하는 도구)합니다.
객체 (Object) : 기억공간 1개로 표현할 수 없고 , 기억공간 여러개를 모아놓은 구조체를 말합니다.
기억공간을 여러개로 표현할 수 있는 것이 객체입니다. 배열과는 다르게 기억공간 안에 담기는 데이터들의 타입이 다른 이질적인 구조입니다.

DTO(Data Transfer Object) : 데이터 전송을 위해 생성되는 객체 로직을 가지지 않는 순수한 데이터 객체
(getter & setter 만 가진 클래스)

 

Q. 책이라는 데이터를 변수에 저장하기 위해서는 책이라는 자료형이 필요합니다.
제목 | 가격 | 출판사 | 저자 | 페이지수 | ISBN       →     BookDTO = 책;    자료형 변수 : BookDTO b;

객체지향 측면 : 현실세계에 있는 객체를 객체지향프로그램에서 사용하기 위해 객체는 상태정보(멤버변수)와 행위정보(멤버메서드)를 가지고 있습니다.

        public class Ex_11_BookDTO {
            public class BookDTO {
                public String title;
                public int price;
                public String company;
                public String author;
                public String isbn;
                public int page;
            }
        }

        -> 현재 상태정보만 작성이 되어있는 상태 + 행위정보도 같이 가지고 있는 구조로 만들어질 수 있다.

        public void read() {
            System.out.println("책을 읽는다")
        }

 

 

만들어진 클래스를 사용하려면 객체를 생성해야합니다.

객체를 메모리에 로딩하는 것 = 객체를 생성하는 과정을 살펴보겠습니다.

객체 자료형은 4byte의 크기를 가지고 있고, 객체 변수에는 번지수가 저장됨을 다시 한번 말합니다. new 연산자와 생성자 메서드로 객체를 생성하면 데이터가 실체화가 됩니다. 인스턴스변수 p가 구체적인 대상물 인스턴스(객체)를 가리키고 있기 때문에 , 해당 변수가 인스턴스 변수가 됩니다.

 

생성자 메서드 (Constructor)란?

객체를 메모리에 멤버변수 & 멤버메서드를 생성하는 역할 = 생성자 메서드 (행위) 메서드는 어딘가에 정의가 되어있고, 메서드를 사용하려면 호출하여 불러와야 합니다.
new Person() ; → Person 클래스 내부에 있는 public Person이라는 메서드를 찾아가야 합니다.
일반적으로 어떤 클래스를 생성하면 클래스 내부에는 자기 자신을 메모리 객체로 생성해야하는데 이걸 기본생성자 (default constructor) 라고 하고, 모든 클래스는 기본 생성자를 가지고 있습니다.
생성자 메서드의 특징으로는 클래스 이름과 메서드 이름이 동일합니다 그리고 return 타입이 아예 없기 때문에 void를 사용하지 않습니다.

생성자의 역할은 기본적으로 멤버 변수와 메서드를 메모리에다가 기억공간을 만들어주는데, 해당 기능을 하는 코드가 기계적으로 내부에서 자동으로 처리를 해주는 역할을 합니다.

 

this : 자신을 가리키는 객체 변수 , 참조변수 , 포인터 변수라고 불립니다.

객체가 만들어진 다음에 객체가 자기 자신의 번지를 가리키는 객체가 만들어집니다. 컴파일러가 멤버변수 및 메서드의 메모리를 생성하고 해당 번지를 this라는 객체변수에다가 넣어줍니다.
눈에 보이지 않지만 자기 자신을 가리키는 객체의 역할을 하며 객체 내부에서 자기 자신의 멤버변수를 가리킬 때 this를 사용하여 가리킬 수 있습니다.

💡 객체가 생성된 후 멤버에 접근하는 방법 . (dot, 도트, 점) 참조연산자로 접근이 가능해집니다.

Person p = new Person(); p라는 인스턴스 변수를 이용하여 데이터에 접근 < p.> p가 가리키고 있는 곳에 name or age 등에 접근이 가능해집니다. ex) p.name / p.phone / p.play();

하나의 클래스 (Person)을 만들어두고, 언제든지 객체를 생성해서 사용할 수 있기 때문에 재 사용성을 가지고 있습니다.

 

힙(Heap Memory)에 만들어진 객체 , 객체의 실체 = 인스턴스 (instance)

 

728x90
반응형
728x90
메서드의 오버로딩
하나의 클래스 내에서 동일한 이름의 메서드를 여러개 사용할 수 있는 객체지향 기법

 

 

 

메서드의 동작 및 기능이 비슷하다면  메서드 이름을 같게 만들어 사용하면 편리하다.
메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야한다.
그러나 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도
조건 - 메서드의 이름이 같고, 매개변수의 개수 or 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.
(=메서드의 시그니처가 달라야한다.)

오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.

 

public class Ex_9_Overloading {
    public static void main(String[] args) {
        float v = add(35.6f, 56.7f);
        System.out.println("v = " + v);
        
        int x = add(15,5);
        System.out.println("x = " + x);
    }

    //Q.매개변수로 두개의 정수 값을 받아서 / 총합을 구하여 / 리턴 하는 / [메서드를 정의]하세요.
    public static int add(int a, int b) {  
		//main이 static 키워드를 가지고 있으니 호출될 메서드에도 static을 작성
        int sum = a+b;
        return sum;
    }

    //Q. 매개변수로 두개의 실수 값을 받아서 / 총합을 구하여 / 리턴하는 / [메서드를 정의] 하세요.
    public static float add(float a, float b) {
        float sum = a+b;
        return sum;
    }
}

 

 

생성된 메서드들의 이름은 같지만 메서드 내의 개수는 같고, 매개변수가 int와 float로 다르기때문에 add 2개를 중복하여 정의할 수 있다 
→ 메서드의 오버로딩메서드들의 이름이 같은 상황에서 만약 add의 중복정의가 많이 되어있다면, add 메서드는 어떤 메서드로 호출이 되어야 하는지는아래로 전부 읽어내려가면서 찾기 때문에 실행 속도가 더딜 수 있다.
매개변수의 타입을 하나하나 비교해서 일치하는 메서드를찾아야하기 때문이다.

동작이나 기능이 비슷하더라도 오버로딩기법으로 작성하는 것이 아닌 , 타입에 맞춰 각각의 메서드 이름을 지정하게 되면,
개발자가 알아야하는 메서드 이름들이 너무 많아지기 때문에 효율적으로 작성하기 위해 중복정의가 가능하도록 한다.

 

정적바인딩이란?
컴파일 시점에서 사용될 (호출될) 메서드가 결정(연결) 되는 바인딩

정적 바인딩(Static binding)은 프로그램의 실행 전에 코드가 수행되는 바인딩 방식입니다.

정적 바인딩은 일반적으로 메서드 오버로딩(Overloading)과 관련이 있습니다.
메서드 오버로딩은 같은 이름의 메서드가 매개변수의 개수나 타입에 따라 다른 동작을 수행할 수 있는 기능을 말합니다.
정적 바인딩은 컴파일러가 함수 호출 시 해당하는 함수를 컴파일 타임에 정확하게 판단하고 바인딩합니다.
이는 메서드 호출 시 호출한 코드의 컨텍스트와 매개변수의 개수와 타입을 기반으로 결정됩니다.

ex) add(34.5f, 56.5f) → add_float_float(34.5f, 56.5f) → 정적바인딩으로 인해 왼쪽과 같이 코드를 작성하면
컴파일될 시점에서 매개변수의 타입을 알아내 _float_float 이렇게 바꾼 후 해당 메서드를 호출하기 때문에 시간이 소요되지 않습니다.

정적 바인딩의 장점은 실행 시간에 바인딩이 발생하지 않기 때문에 실행 성능이 빠르다는 것입니다.
또한 컴파일 시에 바인딩이 결정되므로 오류를 미리 확인할 수 있습니다.
하지만 정적 바인딩은 실행 중에 동적으로 객체의 타입이 변하는 상황에서는 적용되지 않습니다.
예를 들어, 다형성(polymorphism)이 적용된 경우에는 정적 바인딩이 아닌 동적 바인딩(Dynamic binding)이 사용됩니다.
동적 바인딩은 실행 시간에 객체의 실제 타입에 따라 메소드를 결정하므로 실행 시 동적으로 바인딩이 발생합니다.

요약하면, 정적 바인딩은 컴파일 타임에 함수 호출을 어떤 구현체와 연결할지 결정하는 바인딩 방식입니다.
함수 오버로딩과 관련이 있으며 실행 성능이 빠르고 컴파일 시에 오류를 확인할 수 있습니다.
하지만 실행 중에 객체의 타입이 변하는 경우에는 적용되지 않습니다.

728x90
반응형
728x90
Method : 동작
메서드를 정의하고 메서드를 사용(호출)하는 방법

 

Method(메서드)란?

메서드는 동작을 수행할 때 꼭 필요한 기능을 할 수 있도록 해준다. 메서드가 없이는 기능의 동작이 안된다.
개발자가 프로그래밍을 해 놓은 상태로 동작을 할 때, 그 동작을 할 수 있도록 해주는 방법이라고 이해하는게 쉽다.
반복적인 동일 작업을 메서드를 만들어 사용하면 편리하게 사용이 가능하다.
객체 지향 언어에서의 행위나 동작을 의미한다고 말하며, 메서드를 통해서 데이터를 서로 주고받으며 상호작용을 한다.
→ 코딩의 목적 메서드도 클래스처럼 API에서 제공해주는 메서드 , 사용자 정의 메서드 두 종류로 분류가 가능하다.
    다른 언어들에서는 함수(function)이라고 부르기도 한다.

 

https://cloudstudying.kr/lectures/81

 

Object : 사람 동작 1 → 먹다 동작 2 → 걷다 / 해당 동작들은 독립적으로 만들어진다
class : person 동작 1 → eat() 동작 2 → walk() / 객체 지향 프로그램안에서는 클래스 안에 이런 기능을 하는 동작들을 넣어서 만든다.

프로그래밍 언어에서의 메서드

 

 


메서드는 변수라고도 볼 수 있다. (어떠한 동작이 수행된 후 처리의 결과 값이 담겨진 변수)

 

 

메서드는 우선 접근제한자를 먼저 설정해주는데 보통 public으로 설정하여 사용한다.
리턴타입은 수행된 후에 반환하는 결과의 자료형이며, 아무 결과도 반환하지 않으면 자료형에 void를 입력해준다. → void는 반환할 값이 없다는 걸 의미한다.

메소드명 뒤의 ()안에는 매개변수를 작성하며 콤마로 여러개의 매개변수 작성이 가능하다.만약 매개변수가 없더라도 ()는 꼭 작성해주어야 한다.
매개변수 작성시에는 변수의 타입이 같아도 변수의 타입을 생략할 수 없고, 선언할 수 있는 매개변수의 개수는 제한은 없지만 많은 경우 배열이나 참조변수를 사용하며 된다.

 

public class Ex_6_makeMethod {
    public static void main(String[] args) {
        int a = 3;
        int b = 5;
        //add라는 메서드를 호출하여 두 수의 합의 결과를 받아보자
        int result = add(a,b);
        System.out.println("result = " + result);

    }
    //메서드는 독립적으로 만들어야 한다 / main 메서드 밖에서 작성한 후 main메서드에서 호출하여 사용하는 방식이다.
    //Q.[매개변수로 2개의 정수를 받아서] [총합을 구하여][리턴]하는 [메서드를 정의]해보자

    public static int add(int x, int y) {
        int sum = x+y;
        return sum;
    }
}

 

우선 add 라는 메서드를 만들어서 main 메서드에서 호출하여 결과 값을 출력해보는 코드를 작성해보았다.
메서드의 선언부에서 메서드의 이름(add), 매개변수 선언(int x, int y), 반환 타입(static int)을 정해주었고 두 개의 정수를 입력받아 두 값을 더한 결과를 반환하도록 했다.
메서드의 선언부는 메서드가 호출되는 모든 곳에서 동일하게 쓰이기 때문에 신중하게 작성해야한다. 수정 시 모든 곳을 변경해야 하는 번거로움이 발생할 수 있다.

반환 타입이 정해져있지 않을 때는 void로 작성해두어도 되지만 이후 return 반환값의 타입이 정해진다면 반환 타입을 정해줘야한다.
메서드는 수행한 결과를 반환값을 호출한 메서드로 전달하는데, (여기서는 main) 이 값의 타입은 반환 타입과 일치하거나, 적어도 자동 형변환이 가능한 것이어야한다.
그래서 위의 코드에서도 add메서드 내의 return값인 sum이 int형이므로 main 메서드 에서 호출된 값을 담을 result의 타입도 int형으로 작성되었다. return문은 단 하나의 값만 반환할 수 있다.

 

메서드 앞에 static이 붙어 있으면 클래스 메서드이고 , 붙어 있지 않으면 인스턴스 메서드이다.
클래스 메서드는 클래스 변수처럼 객체를 생성하지 않고도 <클래스이름.메서드이름>과 같은 식으로 호출이 가능하지만( “ . “ 을 이용해서 호출가능), 인스턴스 메서드는 반드시 객체를 생성해야만 호출할 수 있다.
객체를 생성한다는 의미는 new 연산자를 사용하여 인스턴스(객체)를 생성함을 의미한다.

 

static은 언제 붙여서 작성해야 할까?
  1. 클래스를 설계할 때 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
  2. 클래스 변수(static)는 인스턴스를 생성하지 않아도 사용할 수 있다.
  3. 클래스 메서드(static메서드)는 인스턴스 변수를 사용할 수 없다.
  4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

 

매개변수 전달 기법 (Call By Value & Call By Reference)

 

외부로부터 데이터를 받을 때, 값을 그대로 받을 수도 있지만 (Call By Value - 값 전달) 값을 번지(주소)를 갖고 있는 데이터를 받을 수도 있다. (Call By Reference(번지 전달))
java는 객체 지향 프로그래밍은 객체를 대부분 다루기 때문에 Call By Reference가 자주 사용된다. 이 때, 번지의 데이터가 어떤 데이터인지 확인할 필요가 있다.

Call By Value Call By Reference
값에 의한 호출방식은 인자로 받은 값을 복사하여 처리한다. 참조에 의한 호출방식은 인자로 받은 값의 주소를 찹조하여 직접 값에 영향을 준다.
원래의 값이 수정되지 않는다. 원래의 값이 수정된다.
변수의 복사본이 전달된다. 변수 자체 전달된다.
실제 인수가 다른 메모리 위치에 생성된다. 실제 인수가 같은 메모리 위치에 생성된다.

 

  • 기본 자료형 : call by value 로 동작 (int, short, long, float, double, char, boolean)
  • 참조 자료형 : call by reference 로 동작 (Array, Class Instance)
728x90
반응형
728x90


객체란?

 

 

객체는 관련된 데이터와 함수(일반적으로 여러 데이터와 함수로 이루어지는데,
객체 안에 있을 때는 보통 프로퍼티와 메소드라고 부른다)의 집합

개발자가 다루는 데이터의 대부분은 객체(Object)이다. 온라인 서점을 구축할 때에의 데이터는 책이고,
영화예매 예약 시스템을 구축 할 때에는 데이터는 영화가 된다.
이러한 책과 영화 같은 데이터를 변수에 저장하기 위해서는 새로운 자료형이 필요!
이러한 새로운 자료형(사용자 정의 자료형)이 왜 필요하고 어떻게 만들어 사용하는 지를 이해하는 것이 중요하다.

 

새로운 자료형이 필요한 이유?

 

객체 데이터는 하나의 구조(하나의 변수)로 이루어진 데이터가 아니라
여러 개의 구조(여러개의 변수)로 이루어진 데이터이다.
객체 데이터를 변수에 저장하기 위해서는 새로운 자료형이 필요하기 때문에
개발자가 직접 자료형을 만들어서 사용하는 것이 “객체지향 프로그래밍”이다.

 

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

 

 

 

데이터 변수를 한 곳에 묶어서 담아서 이동하는 것이 훨씬 편리하기 때문에,
데이터를 구분해서 여러개로 만들어서 하나의 객체로 만들게 되면 데이터처리가 불편하다.

개별로 표현된 데이터들을 하나의 구조로 묶어서 이동하게되면 효율성이 올라가고
클래스 및 패키지에서도 재사용이 가능해진다. (1개의 형태로 이동이 가능)

 

여러 가지인 기억공간을 묶어서 하나로 만든것을 “구조” 라고 한다.
현실세계에서는 구조가 다양한 의미로 쓰이지만,
프로그래밍에서는 기억공간을 여러개로 이어서 만든 하나의 구조를 말한다.


각각의 기억공간에 들어가는 데이터들은 전부 이질적(다름)이다. 하나의 자료형 데이터만 들어가는 것이
아닌 int, String, float 등 서로 다른 구성요소로 이루어지는 것이 진정한 객체가 될 수 있다.

 

★ 구조로 이루어진 것들이 “객체” (Object)라고 할수 있다.

UDDT (사용자 정의 자료형) : 객체 자료형 이라고 말하며 사용자가 직접 정의 하는 것이다.
컴파일러에 내제된 기본 자료형만으로 내가 원하는 결과를 내기 힘들기 때문에 객체 자료형이라는 class를 통해 객체지향적인 콘텐츠를 구현한다.
타입이 다 다를수 있으며 오직 하나의 데이터타입으로 통일된 배열의 개념과는 다르다.

 

 

 

 

class라는 도구를 이용해서 새로운 자료형을 내가 원하는 내용으로 설계할 수 있다.

모델링이란 ? 

일반적으로, 모두에게 공통적으로 이해되도록 약속된 방식(수식,그림 등)으로 표현하는 것

  • 복잡한 현실세계를 단순화(추상화) 즉, 추상적 체계적으로 표현하는 작업 또는 방법
  • 관련자들끼리 상호이해를 쉽게 하도록 다이어그램화 함 현실세계에 있는 객체 책(Object) 많은 상태정보가 존재할 수 있겠지만 객체지향 프로그래밍에서 클래스로 만들어야 하기 때문에 불필요한 속성들을 제외하고 필요한 속성들로만 만드는 것을 모델링이라고 한다.

각각의 인스턴스들이 모여서 book으로 담겨서 하나의 새로은 객체 자료형이 될 수 있다.

//Q. 한 권의 책 데이터를 저장하고 출력해보자 (6개의 변수로)

        String title = "JAVA";
        int price = 30000;
        String company = "민음사";
        String author = "권민지";
        int page = 700;
        String isbn = "11100995";

        System.out.println(title + "\t" + price + "\t" + company + 
				"\t" + author + "\t" + page + "\t" + isbn);

//출력 -> JAVA	30000	민음사	권민지	700	11100995

위와 같이 book이라는 자료형을 하나 만들기 위해서 6개의 변수를 선언했지만, 만약 다른 메서드로 이동을 시켜 출력하고자 할때, 6개의 변수를 담을 구조를 먼저 생성한다고 생각해야한다.
이 후, 각각의 변수를 해당 구조에 담는다면 6개의 데이터가 하나의 구조에 다 들어가게되고 이동을 시킬 때,
구조화 하여 이동하게 된다면 1개만 이동해도 6개의 데이터가 함께 이동하게 되어 효율성이 올라간다.
이러한 구조를 만드는 것을 class를 설계한다고 생각하면된다.

 

 

class : 새로운 자료형을 설계하는 도구 (Modeling) 기존 main 메서드에 작성한 것이 아닌 별도의 Book.java 파일을 생성하여 class를 따로 만들어준 후 해당 클래스를 main 메서드로 이동할 수 있도록 하는 것이다.

책이라는 자료형을 만든 후 해당 자료형을 변수에 담는방법이다.

먼저 선언된 변수에 바로 객체를 넣는다면 b라는 변수의 기억공간에는 1개의 데이터밖에 넣을 수 없기때문에 여러개의 데이터로 이루어진 “책”이라는 객체 데이터는 바로 변수에 담을 수가 없다. 여기서의 b라는 변수는 기본 변수에서 사용하는 변수가 아니고 b에는 객체가 저장되어 있기 때문에 객체변수라고 부른다. (아무것도 가르키고 있지 않음)

  1. 객체를 생성한다는 것은 선언이 된 Book b; 가 b라는 변수엔 Book의 객체가 담아진 게 아니라 해당 객체의 데이터들이 담긴 구조가 메모리로 만들어지며 메모리 = 번지 수 라고 생각하면 되는데, b가 담을 수 있는 자료형이 Book 이라는 말은 b의 번지수를 찾아가보니 b라는 변수가 Book이라는 메모리를 가리키고 있는 것을 알 수 있다. 메모리의 번지가 생성되며, 번지를 b에다가 담아 번지수를 통해 Book 객체로 접근할 수 있게 된다. 메모리가 만들어지면 실체화가 되고, 이 실체는 인스턴스(instance)라고 부른다.
  2. b에 담긴 번지가 Book이라는 자료형을 할당을 통해 가르켜줄 수 있게 되고 , 이 때, 변수 b는 실체 대상물을 가르키고 있기 때문에 인스턴스 변수라고 부른다.

 

Q. 한 권의 책을 변수에 저장하기 위한 객체를 생성 하시오 (책 한 권을 저장하기 위한 [인스턴스 변수]를 만드세요)

Book b = new Book(); → 인스턴스 변수 이 후 인스턴트 변수인 b를 이용해서 메모리 안에 저장된 데이터들로 접근이 가능해지는데, 이 때, Dot (도트연산자) = 참조연산자 “ . “ 을 이용해서 접근할 수 있다. ex ) b.title / b.price / b.company …등 .연산자를 이용해서 접근 가능

728x90
반응형
728x90

 

 

 

객체 지향(중심) 프로그래밍이란 - 클래스 단위로 프로그래밍을 하는것

  • Java 언어는 객체지양 언어이므로 객체(Object) 단위로 프로그래밍 - 사용자 중심 관점 / 현실 세계에존재하는 모든 것들은 object(객체)라고 하는데, 보이지는 않지만 객체들간의 유기적인 연동으로 이루어지는 의미
  • 클래스 (class)단위로 프로그래밍을 해야한다 - 프로그래밍 관점에서 객체지향언어를 바라보는 것

 

 

JavaSE 프로젝트 구조 살펴보기

 

JVM이란 ?

 

컴퓨터에서 프로그램이 실행되려면, 컴퓨터가 읽을 수 있는 언어로 변환이 필요하다. 이렇게 변환된 언어를 기계어라고 한다. 자바에서는 기계어로 번역하는 역할을 JVM이라는 가상 머신을 이용하여 JDK가 설치된 환경이라면 어디서나 자바프로그램을 실행 할 수 있다.

 

JVM의 특징으로는 플랫폼(OS) 독립적인 개발이 가능하다. JVM으로 인해 어떤 운영체제에서 만들어졌다 하더라도 모든 플랫폼에서 다 실행이 가능하다 java는 확장자가 .java인 파일을 컴파일 하게되면 해당 클래스파일이 bytecode (중간어코드) → .class 파일로 만들어지게 되는데, (확장자가 class인) 중간어 코드로는 실행이 되지 않아 만들어진 파일을 각각의 OS에 맞게 내부적으로 exe로 컴파일을 진행히주는 기능을 한다.

 

 

 

Q. 두개의 정수를 사칙연산 출력하는 자바 프로그램을 만들어보자

 

1 . Java 메인 클래스(시작 클래스) 만들기 - main메서드를 가지고 있는 클래스 프로그램을 최초로 동작할 수 있게 하는
메서드는 main이며 main 메서드를 가지고 있는 클래스를 main 클래스라고 한다. 많은 클래스 중에 메인 클래스는
딱 1개가 존재하며, 메인 클래스부터 프로그램이 시작된다.

 

 

 

2. main 메서드에 기능 구현하기
 - 다른 메서드를 여러개 만들 수도 있다. 메모리에 변수가 필요하고, 해당 변수들을 더한 후 더해질 기억공간이 필요하다.

 

public class Calculator {
    public static void main(String[] args) {
        // Q. 두 개의 정수를 사칙연산하여 출력하는 자바 프로그램을 만들어보자.
        int a, b, sum, sub, doub, divd;
        a = 12;
        b = 2;
        sum = a + b;
        sub = a - b;
        doub = a * b;
        divd = a / b;
        System.out.println("a + b = " + sum);
        System.out.println("a - b = " + sub);
        System.out.println("a * b = " + doub);
        System.out.println("a / b = " + divd);

//("a+b=" + (a+b)) : 숫자와 문자열을 더하여 표현할 땐 + 연산자를 이용하여 출력
    }
}
728x90
반응형

+ Recent posts