[TIL 2] 자바 복습 내용 정리

돗치·2024년 1월 31일

사용자 정의 자료형 ex. 영화, 사람, 책 등

String: 문자열을 JAVA에서 객체로 취급

클래스: 객체를 설계(모델링)하는 도구

자료형 측면: 새로운 자료형을 만드는 도구

객체지향 측면: 현실 세계에 있는 객체를 객체지향 프로그램에서 사용하기 위해 객체의 상태 정보(멤버 변수)와 행위 정보(멤버 메서드)를 뽑아서 설계하는 도구

package fc.java.part3;
//클래스의 풀이름 : fc.java.part3.BookDTO
public class BookDTO {
        public String name;
        public int age;
        public String phone;
        public String email;
        public int addr;
        public float weight;
    }
package fc.java.part3;

public class MovieDTO {
    public String title;
    public int day;
    public String major;
    public String part;
    public float time;
    public int level;
}
package fc.java.part3;

public class Person {
    public String name;
    public int age;
    public String phone;
    public void play(){
        System.out.println("운동을 한다.");
    }
    public void eat(){
        System.out.println("음식을 먹다.");
    }
    public void walk(){
        System.out.println("걷다.");
    }
}

모델링 된 객체(클래스)를 사용하기 위해서 메모리에 객체 생성해야 함.

객체 생성 = 객체에 메모리를 올리는 과정

객체 구성 정보 2가지 = 상태 정보, 행위 정보

생성자 메서드

  • new 연산에 의해서 호출 됨
  • 자신이 갖고 있는 멤버들을 메모리에 올려 객체 생성
  • 메서드 이름은 클래스 이름과 동일
  • 접근 제한자가 public인 경우만 호출
  • 모든 클래스는 기본 생성자를 갖고 있음
  • 객체의 초기화를 위해 사용

ex. new Person(); → new연산자 + 생성자 메서드()

ex. Person pp = 객체 변수

ex. Person p = new Person();p = 새로운 자료형 + 인스턴스 변수 = new연산자 + 생성자 메서드()

객체가 생성된 후 멤버에 접근하는 방법 - .(dot, 도트) 연산자로 접근

this: 객체가 생성된 후 자기 자신을 가리키는 레퍼런스 변수

인스턴스: 힙에 만들어진 객체

package fc.java.part3;

public class PersonTest {
    public static void main(String[] args) {
        Person p = new Person();
        p.name="홍길동";
        p.age=30;
        p.phone = "010-1111-1111";
        System.out.println(p.name+"\t"+p.age+"\t"+"\t"+p.phone);
        p.play();
        p.eat();
        p.walk();
        Person p1 = new Person();
        p1.name="동동이";
        p1.age=34;
        p1.phone = "010-2222-2222";
        System.out.println(p1.name+"\t"+p1.age+"\t"+"\t"+p1.phone);
        p1.play();
        p1.eat();
        p1.walk();
    }
}
package fc.java.part3;

public class MemberDTO {
    public String name;
    public int age;
    public String phone;
    public String email;
    public int addr;
    public float weight;
}

모델: 클래스를 역할에 따라 부르는 이름 → 역할에 따라 다양한 모델 만들어서 사용 가능

<종류>

  • 시작 클래스(모델)
  • DTO, VO Model : 데이터를 담는(이동) 모델 - 데이터를 하나로 묶어야 될 경우(데이터를 하나로 수집)
  • DAO Model : 데이터를 처리(DB)를 하는 모델
  • Utility Model : 도움(Utility)을 주는 모델

DTO, VO: 이질적인 데이터를 저장하여 다른 클래스로 이동할때 사용하는 클래스.
<차이>

DTO - 데이터의 수정이 가능할 때 사용
VO - 데이터를 저장 후 변경을 할 수 없도록 하는 것. setter를 사용하지 않는 것이 특징

package fc.java.part3;

public class CarDTO {
    public int carSn;
    public String carName;

    public int carPrice;
    public String carOwner;
    public int carYear;
    public String carType;
}
package fc.java.part3;
import java.util.Scanner;

public class CarTest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("자동차 일련번호: ");
        int carSn = scan.nextInt();

        scan.nextLine();

        System.out.println("자동차이름: ");
        String carName = scan.nextLine();
        System.out.println("자동차가격: ");
        int carPrice = scan.nextInt();

        scan.nextLine();

        System.out.println("자동차소유자: ");
        String carOwner = scan.nextLine();
        System.out.println("자동차년식: ");
        int carYear = scan.nextInt();

        scan.nextLine();

        System.out.println("자동차타입:");
        String carType = scan.nextLine();

        // System.out.println(carSn+"\t"+carName+"\t"+carPrice+"\t"+carOwner+"\t"+carYear+"\t"+carType);
        CarDTO car = new CarDTO();
        car.carSn = carSn;
        car.carName = carName;
        car.carPrice = carPrice;
        car.carOwner = carOwner;
        car.carYear = carYear;
        car.carType = carType;
        carInfoPrint(car);
    }

    public static void carInfoPrint(CarDTO car) {
        System.out.println(car.carSn + "\t" + car.carName + "\t" + car.carPrice + "\t" + car.carOwner + "\t" + car.carYear + "\t" + car.carType);
    }
}

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

DAO: Data Access Object

CRUD: Create, Read, Update, Delete

model package에 CarDAO, CarDTO. part3 package에 CarInsertTest 포함함 ↓

package fc.java.model;

public class CarDAO {
    public void carInsert(CarDTO car) {
        System.out.println("car정보가 DB에 저장이 되었습니다.");
    }
    public void carSelect(){
        System.out.println("car정보가 출력 되었습니다.");
    }
}
package fc.java.part3;
import fc.java.model.CarDTO;

import java.util.Scanner;

public class CarTest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("자동차 일련번호: ");
        int carSn = scan.nextInt();

        scan.nextLine();

        System.out.println("자동차이름: ");
        String carName = scan.nextLine();
        System.out.println("자동차가격: ");
        int carPrice = scan.nextInt();

        scan.nextLine();

        System.out.println("자동차소유자: ");
        String carOwner = scan.nextLine();
        System.out.println("자동차년식: ");
        int carYear = scan.nextInt();

        scan.nextLine();

        System.out.println("자동차타입:");
        String carType = scan.nextLine();

        // System.out.println(carSn+"\t"+carName+"\t"+carPrice+"\t"+carOwner+"\t"+carYear+"\t"+carType);
        CarDTO car = new CarDTO();
        car.carSn = carSn;
        car.carName = carName;
        car.carPrice = carPrice;
        car.carOwner = carOwner;
        car.carYear = carYear;
        car.carType = carType;
        carInfoPrint(car);
    }

    public static void carInfoPrint(CarDTO car) {
        System.out.println(car.carSn + "\t" + car.carName + "\t" + car.carPrice + "\t" + car.carOwner + "\t" + car.carYear + "\t" + car.carType);
    }
}
package fc.java.part3;
import fc.java.model.CarDAO;
import fc.java.model.CarDTO;

import java.util.Scanner;

public class CarInsertTest {
    public static void main(String[] args) {
        Scanner scan = new Scanner(System.in);
        System.out.println("자동차 일련번호: ");
        int carSn = scan.nextInt();

        scan.nextLine();

        System.out.println("자동차이름: ");
        String carName = scan.nextLine();
        System.out.println("자동차가격: ");
        int carPrice = scan.nextInt();

        scan.nextLine();

        System.out.println("자동차소유자: ");
        String carOwner = scan.nextLine();
        System.out.println("자동차년식: ");
        int carYear = scan.nextInt();

        scan.nextLine();

        System.out.println("자동차타입:");
        String carType = scan.nextLine();

        // System.out.println(carSn+"\t"+carName+"\t"+carPrice+"\t"+carOwner+"\t"+carYear+"\t"+carType);
        CarDTO car = new CarDTO();
        car.carSn = carSn;
        car.carName = carName;
        car.carPrice = carPrice;
        car.carOwner = carOwner;
        car.carYear = carYear;
        car.carType = carType;

        CarDAO dao = new CarDAO();
        dao.carInsert(car);
        dao.carSelect();
    }
}

Utility 클래스

  • 반복적으로 사용해야 될 동작을 별도의 클래스로 만들어 놓고 필요할 때 사용
  • 필요하면 만들어서 사용
  • 자바에서도 java.util패키지에 이러한 Utility클래스가 많이 있음

Utility, Helper, Facade (도움을 주는 클래스들)

  1. 날짜, 통화, 시간 정보 획득 기능(동작)

  2. 인코딩(한글 깨짐) 기능(동작)

  3. DAO이외의 별도 기능(동작)

    → main 메서드에서 분리해서 코딩

Model: 객체지향프로그래밍 에서 클래스를 역할에 따라 부르는 이름

DTO, DAO, Utility: 우리가 클래스로 만들어 사용하게 될 모델의 종류 3가지

DTO: 객체 데이터를 하나로 수집 해야 할 경우 필요한 모델

DAO: 데이터베이스에 데이터를 저장, 수정 하거나 검색, 삭제를 하기 위해서 만들어진 모델

package fc.java.model;

public class CarUtility {
    public void carPrint(CarDTO car) {
        System.out.println(car.carSn + "\t" + car.carName + "\t" + car.carPrice + "\t" + car.carOwner + "\t" + car.carYear + "\t" + car.carType);
    }

}
package fc.java.part3;
import fc.java.model.CarDTO;
import fc.java.model.CarUtility;

public class CarUtilityTest {
    public static void main(String[] args) {
        int carSn=1110;
        String carName = "BMW828i";
        int carPrice = 90000000;
        String carOwner = "홍길동";
        int carYear = 2015;
        String carType="G"; //'G' ->char
        //데이터를 하나로 묶는다 (이동)
        CarDTO car=new CarDTO();
        car.carSn=carSn;
        car.carName=carName;
        car.carPrice=carPrice;
        car.carOwner=carOwner;
        car.carYear=carYear;
        car.carType=carType;
        // carPrint(car);
        CarUtility carUtil = new CarUtility();
        carUtil.carPrint(car);
    }
        //매개변수로 자동차의 정보를 입력받아 출력하는 메서드 작성

}

객체 상호간에 접근 제어하는 방법(클래스 상호 간)

  • 4가지의 접근제한자 사용
  • 클래스 설계할 때 고려해야한다.
  • 클래스와 클래스 내부에서 만들어지는 멤버에 접근 제한자 사용 가능

접근제한자

public: 모든 패키지에서 접근 가능

private: 모든 패키지에서 접근 불가(자기 자신만 접근 가능), (모든 멤버변수는 private)

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

default: 동일한 패키지에서만 접근 가능(단어로 존재하지 않음)

package fc.java.part3;

public class PersonAccessTest {
    public static void main(String[] args) {
        Person p = new Person();
        p.name="홍길동";
        p.age=1000;
        p.phone="010-2222-2222";
        System.out.println(p.name+"\t"+p.age+"\t"+p.phone);
    }
}
package fc.java.model;

public class Member1DTO {
    public String name;
    private int age;
    public String phone;
    public void play(){
        System.out.println("운동을 한다.");
    }
}
package fc.java.part3;

import fc.java.model.Member1DTO;

public class AccessModifier {
    public static void main(String[] args) {
        Member1DTO dto = new Member1DTO();
        dto.name = "홍길동";
        //dto.age = 1000; //에러발생 (접근불가)
        dto.phone="010-2222-2222";
        System.out.println(dto.name+"\t"+dto.phone);
        dto.play();
    }
}

패키지

  • 서로기능이 비슷한 클래스들끼리 모아서 관리를 쉽게 하기 위해 사용(폴더 개념)
  • 패키지 외부에서 클래스의 접근을 할 수 없도록 하기 위해서 사용(보안 측면)
  • 자바에서 제공해주는 API도 패키지 형태로 배포

대표적인 패키지

java.lang(default package) - 자바에서 자주 사용하는 클래스(String, System 등)

java.io - 입출력 관련 클래스(InputStream 등)

java.net - (네트워킹 관련 클래스)

java.util - 도움을 주는 클래스(Scanner 등)

java.sql - 데이터베이스 관련 클래스, SQL

java.math - 수학 관련 클래스

클래스 접근 방법 - 클래스 전체 이름으로 접근, import로 접근

import: 패키지를 현재 클래스에 포함 시킬 때 사용하는 명령어

자바 제공 클래스 형태: ex. java.lang.String, java.lang.System

직접 만든 클래스 형태: ex. fc.java.model.BookDTO, fc.java.model.MemberDTO

package fc.java.part3;

import fc.java.model.CarDTO;

import java.util.*;
import fc.java.model.*;

public class PackageNameTest {
    public static void main(String[] args) {
        String str="이이이";
        Scanner scan = new Scanner(System.in);
        System.out.println("Hello World");

        CarDTO car= new CarDTO();
        CarDAO dao=new CarDAO();
    }
}

정보 은닉: 다른 객체에게 자신의 정보를 숨기고 자신의 동작, 기능, 연산만을 통해 접근을 허용하는 것, 클래스 외부에서 특정 정보에 접근을 막음

정보 은닉 된 정보에 접근하는 방법: setter, getter 메소드를 통해 접근 가능

  • setter 메서드로 값을 저장하고 set + 멤버변수의 첫 영문을 대문자로 만들기
  • getter 메서드로 값을 얻어오고 get + 멤버변수의 첫 영문을 대문자로 만들기
package fc.java.model;

public class PersonVO {
    private String name;
    private int age;
    private String phone;

    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getPhone() {
        return phone;
    }
}
package fc.java.part3;
import fc.java.model.PersonVO;
public class PersonInfoHide {
    //한 사람의 회원 정보를 저장할 객체
    public static void main(String[] args) {
            PersonVO vo = new PersonVO();
            vo.setName("홍길동");
            vo.setAge(50);
            vo.setPhone("010-2222-2222");
        //vo.name="홍길동";
        //vo.age = 50;
        //vo.phone = "010-2222-2222";
            System.out.println(vo.getName() + "\t" + vo.getAge() + "\t" + vo.getPhone());
        //System.out.println(vo.name+"\t"+vo.age+"\t"+vo.phone);
        }
    }
package fc.java.part3;
import fc.java.model.PersonVO;

public class SetterGetterTest {
    public static void main(String[] args) {
        PersonVO vo = new PersonVO();
        vo.setAge(50);
        vo.setName("홍길동");
        vo.setPhone("010-1111-1111");

        System.out.println(vo.getName() + "\t" + vo.getAge() + "\t" + vo.getPhone());
    }
}

생성자를 이용한 객체 초기화

객체생성 시 원하는 값으로 초기화 하기

  • 생성자 메서드를 오버로딩 해서 초기화 가능
package fc.java.part3;

import fc.java.model.PersonVO;

public class ConstructorOverloading {
    public static void main(String[] args) {
        PersonVO vo = new PersonVO();
        PersonVO vo1 = new PersonVO("나길동", 60, "010-2222-2222");
        PersonVO vo2 = new PersonVO("조길동", 50, "010-3333-3333");
        System.out.println(vo.getName() + "\t" + vo.getAge() + "\t" + vo.getPhone());
        System.out.println(vo1.getName() + "\t" + vo1.getAge() + "\t" + vo1.getPhone());
        System.out.println(vo2.getName() + "\t" + vo2.getAge() + "\t" + vo2.getPhone());
    }
}
 package fc.java.model;

public class PersonVO {
    private String name;
    private int age;
    private String phone;

    public PersonVO(){
        this.name="홍길동";
        this.age=50;
        this.phone="010-2222-2222";
    }
    public PersonVO(String name, int age, String phone){
        this.name=name;
        this.age=age;
        this.phone=phone;
    }
    public void setName(String name) {
        this.name = name;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public String getPhone() {
        return phone;
    }
}

toString() 메서드로 객체 값 출력하기

  • 객체가 갖고 있는 값 전체를 문자열 형태로 넘겨주기 - toString() 메서드를 이용하여 객체가 갖고 있는 모든 값 리턴

잘 설계된 VO 클래스 란?

  1. 모든 생태정보를 정보 은닉하기(private)
  2. 디폴트 생성자 반드시 만들기
  3. 생성자 메서드를 오버로딩 하여 객체 초기화 하기
  4. setter 메서드를 만들기 (값 저장)
  5. getter 메서드를 만들기 (값 얻기)
  6. toString 메서드를 만들기 (객체가 갖고 있는 전체 값 출력 용도)
package fc.java.part3;

import fc.java.model.PersonVO;

public class ToStringTest {
    public static void main(String[] args) {
        PersonVO vo = new PersonVO("홍길동", 34, "010-2222-2222");
        // System.out.println(vo.getName() + "\t" + vo.getAge() + "\t" + vo.getPhone());
        System.out.println(vo.toString());
        System.out.println(vo);  // vo.toString과 같음
        }
}
package fc.java.model;

public class MovieVO {
    private String title;
    private int day;
    private String major;
    private String part;
    private float time;
    private int level;
    public MovieVO(){

    }
    public MovieVO(String title, int day, String major, String part, float time, int level) {
        this.title = title;
        this.day = day;
        this.major = major;
        this.part = part;
        this.time = time;
        this.level = level;
    }       //Generate -> constructor

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getDay() {
        return day;
    }

    public void setDay(int day) {
        this.day = day;
    }

    public String getMajor() {
        return major;
    }

    public void setMajor(String major) {
        this.major = major;
    }

    public String getPart() {
        return part;
    }

    public void setPart(String part) {
        this.part = part;
    }

    public float getTime() {
        return time;
    }

    public void setTime(float time) {
        this.time = time;
    }

    public int getLevel() {
        return level;
    }

    public void setLevel(int level) {
        this.level = level;
    }       //Generate -> getter and setter

    @Override
    public String toString() {
        return "MovieVO{" +
                "title='" + title + '\'' +
                ", day=" + day +
                ", major='" + major + '\'' +
                ", part='" + part + '\'' +
                ", time=" + time +
                ", level=" + level +
                '}';
    }       //Generate -> toString
}
package fc.java.part3;

import fc.java.model.MovieVO;

public class BestVOModeling {
    public static void main(String[] args) {
        MovieVO vo = new MovieVO("아바타", 20221214, "제이크 설리", "액션", 192.0f, 12);
        System.out.println(vo.toString());
        System.out.println(vo.getLevel());
    }
}

배열: 동일한 기억공간을 메모리에 연속적인 구조로 만들어서 사용하는 자료구조

클래스: 이질적인 구조 설계

new : 객체 생성하면서 공통적으로 사용하는 연산자

기본 배열 → float[] arr = new float[4]

객체 배열 → Student[] std = new Student[4];

package fc.java.model;

public class Student {
    private String name;
    private String dept;
    private int age;
    private String email;
    private int year;
    private String phone;
    public Student(){

    }

    public Student(String name, String dept, int age, String email, int year, String phone) {
        this.name = name;
        this.dept = dept;
        this.age = age;
        this.email = email;
        this.year = year;
        this.phone = phone;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getDept() {
        return dept;
    }

    public void setDept(String dept) {
        this.dept = dept;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getYear() {
        return year;
    }

    public void setYear(int year) {
        this.year = year;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", dept='" + dept + '\'' +
                ", age=" + age +
                ", email='" + email + '\'' +
                ", year=" + year +
                ", phone='" + phone + '\'' +
                '}';
    }
}
package fc.java.part3;

import fc.java.model.Student;

public class StudentTest {
    public static void main(String[] args) {
        int[] arr = new int[6];
        arr[0]=10;
        arr[1]=30;
        arr[2]=67;
        arr[3]=98;
        arr[4]=55;
        arr[5]=32;
        for(int i=0;i<arr.length;i++){
            System.out.println(arr[i]);
        }
        Student vo = new Student("홍길동", "컴퓨터공학부", 37, "bit@empas.com", 2023110, "010-2222-2222");
        System.out.println(vo.toString());

    }
}
package fc.java.part3;

import fc.java.model.Student;

public class StudentArrayTest {
    public static void main(String[] args) {
        Student[] std = new Student[4];
        std[0] = new Student("홍길동", "컴공", 33, "bit@empas.com", 2023110, "010-2222-2222");
        std[1] = new Student("이길동", "솦웨", 13, "bit@empas.com", 2023111, "010-2232-2222");
        std[2] = new Student("오길동", "건축", 23, "bit@empas.com", 2023112, "010-2322-2222");
        std[3] = new Student("김길동", "통신", 43, "bit@empas.com", 2023113, "010-2233-2222");
        for(int i=0;i<std.length; i++)
        {
            System.out.println(std[i].toString());
        }
        for(Student st  : std){
            System.out.println(st.toString());
        }

    }
}

0개의 댓글