사용자 정의 자료형 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가지 = 상태 정보, 행위 정보
생성자 메서드
ex. new Person(); → new연산자 + 생성자 메서드()
ex. Person p → p = 객체 변수
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: 이질적인 데이터를 저장하여 다른 클래스로 이동할때 사용하는 클래스.
<차이>
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 클래스
Utility, Helper, Facade (도움을 주는 클래스들)
날짜, 통화, 시간 정보 획득 기능(동작)
인코딩(한글 깨짐) 기능(동작)
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);
}
//매개변수로 자동차의 정보를 입력받아 출력하는 메서드 작성
}
객체 상호간에 접근 제어하는 방법(클래스 상호 간)
접근제한자
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();
}
}
패키지
대표적인 패키지
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 메소드를 통해 접근 가능
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() 메서드로 객체 값 출력하기
잘 설계된 VO 클래스 란?
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());
}
}
}