// 클래스 (Class) : 객체(Object)를 생성하기 위한 자료형 - 참조형
// > Java에서는 객체(Object) 대신, 인스턴스(Instance)라는 용어
// > 현실에 존재하는 사물 또는 관념을 클래스라는 자료형으로 표현하여 프로그램에 사용할 수 있도록 객체로 생성
// > Java에서는 객체(Object) 대신, 인스턴스(Instance)라는 용어
// > 현실에 존재하는 사물 또는 관념을 클래스라는 자료형으로 표현하여 프로그램에 사용할 수 있도록 객체로 생성
// 클래스 선언 형식
// 형식) [public] class 클래스명 {
// 필드- 표현대상의 속성값을 저장하기 위한 멤버변수
// ...
// 생성자(Constructor) - 클래스로 객체를 생성하기 위한 특별한 메소드
// ...
// 메소드 (Method) - 표현 대상의 행위를 명령으로 제공하기 위한 함수 - 멤버함수
// ...
// }
// 형식) [public] class 클래스명 {
// 필드- 표현대상의 속성값을 저장하기 위한 멤버변수
// ...
// 생성자(Constructor) - 클래스로 객체를 생성하기 위한 특별한 메소드
// ...
// 메소드 (Method) - 표현 대상의 행위를 명령으로 제공하기 위한 함수 - 멤버함수
// ...
// }
// > 메소드는 필드를 사용한 명령으로 필요한 기능을 제공되도록 작성
// > 클래스 내부에 선언된 모든 메소드는 필드 접근 가능
// > 클래스 내부에 선언된 모든 메소드는 필드 접근 가능
// 클래스를 작성할때 필드와 메소드에는 접근 지정자를 사용하여 접근 허용 유무 설정 가능
// 접근 제한자(Access Modifier) - private, package(default), protected, public
// > 클래스, 필드, 생성자, 메소드를 선언할 때 접근 허용을 설정하기 위한 키워드
// 접근 제한자(Access Modifier) - private, package(default), protected, public
// > 클래스, 필드, 생성자, 메소드를 선언할 때 접근 허용을 설정하기 위한 키워드
// private - 클래스 내부에서만 접근 가능 하도록 허용 하는 접근제한자
// > 필드, 생성자, 메소드를 은닉화 처리하기 위해 사용 - 클래스 외부에서 접근할 경우 에러 발생
// > 일반적으로 필드에 사용하는 접근 제한자 - 객체로 필드의 직접적인 접근을 제한하기 위한 사용
// > 데이터 은닉화 (Data hiding) : 값을 숨겨 보호하기 위한 기능
// > 필드, 생성자, 메소드를 은닉화 처리하기 위해 사용 - 클래스 외부에서 접근할 경우 에러 발생
// > 일반적으로 필드에 사용하는 접근 제한자 - 객체로 필드의 직접적인 접근을 제한하기 위한 사용
// > 데이터 은닉화 (Data hiding) : 값을 숨겨 보호하기 위한 기능
/ public - 모든 패키지의 클래스에서 접근 가능하도록 허용하는 접근 제한자
// > 일반적으로 메소드에 사용하는 접근 제한자 - 프로그램 작성에 필요한 모든 클래스에서 접근 할수있도록 허용
// > 일반적으로 메소드에 사용하는 접근 제한자 - 프로그램 작성에 필요한 모든 클래스에서 접근 할수있도록 허용
// 자동차를 객체 모델하여 클래스로 작성
// > 속성 : 모델명, 엔진상태, 현재속도
// > 행위 : 시동 온, 시동 오프, 속도 증가, 속도 감소, 이동 중지 - 메소드
// > 속성 : 모델명, 엔진상태, 현재속도
// > 행위 : 시동 온, 시동 오프, 속도 증가, 속도 감소, 이동 중지 - 메소드
Car
public class Car {
// 필드
String modelName; // 모델명
boolean engineStatus; // 엔진상태 - (false : EngineOff / true : EngineOn )
int currentSpeed; // 현재 속도
// 생성자 - 생성자를 선언하지 않으면, 매개변수가 없는 기본 생성자가 자동으로 생성되어 제공
// 메소드 - 필드를 사용하여 메소드의 명령으로 필요한 기능을 제공되도록 작성
public void startEngine() { // 시동 온 (On)
engineStatus = true; // 엔진상태
System.out.println(modelName + "의 자동차 시동을 켰습니다.");
}
public void stopEngine() { // 시동 오프(Off)
if ( currentSpeed != 0) {
/*
currentSpeed = 0;
System.out.println(modelName + "의 자동차가 멈췄습니다.");
*/
// 클래스 내부에 선언된 메소드는 서로 호출 가능
speedZero(); // > 코드의 중복성을 최소화 하여 프로그램의 생상성을 및 유지보수의 효율성 증가
}
engineStatus = false;
System.out.println(modelName + "의 자동차 시동을 껐습니다.");
}
public void speedUp (int speed) { // 속도 증가
if (!engineStatus) { // 엔진이 꺼져있는경우
System.out.println(modelName + "의 자동차 시동이 꺼져 있습니다.");
return; // 메소드 종료 (시동이 꺼져있는 상태면, 알려주고 꺼줌.)
}
if (currentSpeed + speed > 150) {
speed = 150 - currentSpeed;
}
currentSpeed += speed;
System.out.println( modelName + "의 속도가" + speed + "km/h 증가 되었습니다." +
" 현재 속도는 " + currentSpeed + "Km/h 입니다.");
}
public void speedDown(int speed) { // 속도 감소
if (!engineStatus) { // 엔진이 꺼져 있는경우
System.out.println(modelName + "의 자동차 시동이 꺼져있습니다");
return; // 메소드 종료 (시동이 꺼져있는 상태면, 알려주고 꺼줌.)
}
if (currentSpeed < speed) {
speed = currentSpeed;
}
currentSpeed -= speed;
System.out.println (modelName + "의 자동차 속도가 " + speed + "km/h 감소 되었습니다." +
"현재 속도는 " + currentSpeed + "km/h 입니다.");
}
// 이동 중지
public void speedZero() { // 이동 중지 (매개변수)
currentSpeed = 0;
System.out.println(modelName + "의 자동차가 멈췄습니다.");
}
// Setter 메소드 - 매개변수로 값을 전달받아 필드값을 변경하는 메소드
// 형식) public void set필드명(자료형 변수명) { 필드명 = 변수명;}
// > 매개변수에 전달되어 저장된 값에 대한 검증 가능
// 형식) public void set필드명(자료형 변수명) { 필드명 = 변수명;}
// > 매개변수에 전달되어 저장된 값에 대한 검증 가능
public String getModelName() {
return modelName;
}
// Setter 메소드 - 매개변수로 값을 전달받아 필드값을 변경하는 메소드
// 형식) public void set필드명(자료형 변수명) { 필드명 = 변수명;}
// > 매개변수에 전달되어 저장된 값에 대한 검증 가능
public void setModelName(String name) {
// 매개변수에 저장된 값에 대한 검증
// this - 메소드 내부에서 클래스의 객체를 표현하는 키워드
// > this 키워드를 사용하여 필드 표현
this.modelName = modelName; // this객체의 모델이름
}
// 인텔리제이에은닉화 처리된 필드에 대한 Getter 메소드와 Setter 메소드를 생성하는 기능
// 단축키 ) Alt + Insert
public boolean isEngineStatus() {
return engineStatus;
}
public void setEngineStatus(boolean engineStatus) {
this.engineStatus = engineStatus;
}
public int getCurrentSpeed() {
return currentSpeed;
}
public void setCurrentSpeed(int currentSpeed) {
this.currentSpeed = currentSpeed;
}
}
// 클래스로 객체를 생성하는 방법
// 형식 ) 클래스명 참조변수 = new 클래스명();
// > new 연산자로 클래스의 생성자를 호출하여 객체를 생성하고 생성된 객체의 메모리 주고를
// 주소를 참조변수에 저장
// > 참조변수에 저장된 객체는 . 연산자를 사용하여 필드 또는 메소드에 이용해 프로그램 작성
// Car 클래스를 객체로 생성하여 작성된 프로그램
// 클래스 - 객체를 만들기위한 틀
// 형식 ) 클래스명 참조변수 = new 클래스명();
// > new 연산자로 클래스의 생성자를 호출하여 객체를 생성하고 생성된 객체의 메모리 주고를
// 주소를 참조변수에 저장
// > 참조변수에 저장된 객체는 . 연산자를 사용하여 필드 또는 메소드에 이용해 프로그램 작성
// Car 클래스를 객체로 생성하여 작성된 프로그램
// 클래스 - 객체를 만들기위한 틀
CarApp
public class CarApp {
public static void main(String[] args) {
// Car 클래스를 객체를 생성하여 참조변수에 저장 ▽
// > 하나의 클래스로 서로 다른 객체를 여러개 생성 가능 ▽
// 객체를 생성하면 객체의 필드에서는 기본값(숫자 - 0 / 논리형 - null)을 초기값으로 자동 저장
Car car0ne = new Car();
Car carTwo = new Car();
Car carThree = new Car();
System.out.println("carOne = " + car0ne);
System.out.println("carTwo = " + carTwo);
System.out.println("carThree = " + carThree);
System.out.println("-------------------------------------------------------");
// 참조변수.필드명 : 참조변수에 저장된 객체가 . 연산자를 사용하여 필드에 접근
// > 객체의 필드에는 기본값이 초기값으로 자동 저장
// 문제점) 객체를 사용하여 필드에 직접적인 접근을 허용하면 필드의 비정상적인 값 저장 가능
// 해결법) 클래스 선언시 필드를 은닉화 처리하여 선언 - 은닉화 선언된 필드에 접근할 경우 에러 발생
// car0ne.modelName = "싼타페"; // 객체의 필드값 변경
car0ne.setModelName("싼타페"); // 필드값을 변경하는 Setter 메소드 호출
System.out.println("첫번째 자동차 모델명 = " + car0ne.modelName); // 객체의 필드값 사용
System.out.println("첫번째 자동차 엔진상태 = " + car0ne.engineStatus);
System.out.println("첫번째 자동차 현재속도 = " + car0ne.currentSpeed);
System.out.println("-------------------------------------------------------");
// carTwo.modelName = "쏘나타";
// carTwo.engineStatus = true; // 메소드 호출해서 함
// carTwo.currentSpeed = 80; // 메소드 호출해서 함
System.out.println("두번째 자동차 모델명 = " + carTwo.modelName); // 객체의 필드값 사용
System.out.println("두번째 자동차 엔진상태 = " + carTwo.engineStatus);
System.out.println("두번째 자동차 현재속도 = " + carTwo.currentSpeed);
carTwo.setModelName("쏘나타");
carTwo.setEngineStatus(true);
carTwo.setCurrentSpeed(80);
System.out.println("-------------------------------------------------------");
// 참조변수, 메소드명 (값, 값...) - 참조변수에 저장된 객체가 . 연산자를 사용하여 메소드 호출
car0ne.startEngine(); // 시동켜짐
car0ne.speedUp(50);
car0ne.speedUp(30);
car0ne.speedDown(40);
car0ne.speedZero();
car0ne.stopEngine(); // 시동끔
}
}
carOne = oop.Car@1a407d53
carTwo = oop.Car@3d8c7aca
carThree = oop.Car@5ebec15
-------------------------------------------------------
첫번째 자동차 모델명 = null
첫번째 자동차 엔진상태 = false
첫번째 자동차 현재속도 = 0
-------------------------------------------------------
두번째 자동차 모델명 = null
두번째 자동차 엔진상태 = false
두번째 자동차 현재속도 = 0
-------------------------------------------------------
null의 자동차 시동을 켰습니다.
null의 속도가50km/h 증가 되었습니다. 현재 속도는 50Km/h 입니다.
null의 속도가30km/h 증가 되었습니다. 현재 속도는 80Km/h 입니다.
null의 자동차 속도가 40km/h 감소 되었습니다.현재 속도는 40km/h 입니다.
null의 자동차가 멈췄습니다.
null의 자동차 시동을 껐습니다.
Overload
package oop;
public class Overload {
public void displayInt(int param) {
System.out.println("정수값 = " + param);
}
public void displayBoolean(boolean param) {
System.out.println("논리값 = " + param);
}
public void displayString (String param) {
System.out.println("문자열 = " + param);
}
// 메소드 오버로딩 (Metod OverLoading) : 클래스에서 동일한 기능을 제공하는 메소드가 매개변수에 의해 여러개 선언 해야하할 경우
// 매개변수에 의해 여러개 선언해야할 경우 메소드의 이름을 같도록 선언하는 기능
// > 매개변수의 자료형 또는 갯수 가 같지 않도록 선언
// > 접근제한자와 반환형은 오버로드 선언과 무관
public void display (int param) {
System.out.println("정수값 = " + param);
}
// public void display (int param / 매개변수) {
// System.out.println("정수값 = " + param);
// } // 매개변수가 같아서 오류남
public void display (boolean param) { // 메소드이름이 같더라도, 매개변수가 달라서 오류안남 >> 매개변수는 같아도되는데, 자료형 또는 갯수가 달라야함
System.out.println("논리값 = " + param);
}
public void display (String param) {
System.out.println("문자열 값 = " + param);
}
}
OverloadApp
package oop;
public class OverloadApp {
public static void main(String[] args) {
Overload overload = new Overload();
overload.displayInt(100);
// overload.displayInt(false); 매개변수값이 맞지않으면 오류남.
overload.displayBoolean(false);
overload.displayString("홍길동");
System.out.println("-----------------------------------------------");
// 오버로드 선언된 메소드는 매개변수에 전닫ㄹ되는 값에 따라 메소드를 선택하여 호출
// > 메소드 오버로드에 의한 다형성
// 다형성 (Polymorphism) - 같은 이름의 메소드를 호출할 경우 상태에 메소드를 선택 호출
// 되는 기능 > 메소드 오버로드, 메소드 오버라이드
overload.display(200);
overload.display(true);
overload.display("임꺽정");
// overload.display (12.34); // 전달받은 값에대한 자료형의 매겨변수가 없는 경우 에러 발생
}
}
정수값 = 100
논리값 = false
문자열 = 홍길동
-----------------------------------------------
정수값 = 200
논리값 = true
문자열 값 = 임꺽정
Member
// 회원정보(아이디, 이름, 이메일)를 저장하기 위한 클래스
// > VO (Value Object) 클래스 : 특정 대상의 값을 저장하기위한 객체를 생성하기 위한 클래스
public class Member {
// 필드 선언 - 객체를 생성하면 객체의 필드에는 기본값이(숫자형 : 0, 논리형 : false, 참조형 : null) 초기값으로 자동 저장
private String id;
private String name;
private String email;
//생성자 선언 : 객체를 생성하기 위한 특별한 형태의 메소드
// => 생성자를 선언하지 않으면 매개변수가 없는 기본 생성자 제공
// => 생성자를 선언하면 매개변수가 없는 기본 생성자 미제공
// => 객체 필드에 원하는 초기값이 저장된 객체를 생성하기 위한 생성자를 선언
//형식) 접근제한자 클래스명(자료형 변수명, 자료형 변수명, ... ) { 명령; 명령; ... }
// => 반환형을 작성하지 않고 생성자의 이름은 반드시 클래스 이름과 동일하게 작성
// => 메소드 오버로드를 사용하여 생성자를 여러개 선언 가능
// => 일반적으로 생성자에서는 필드에 필요한 초기값을 저장하기 위한 명령 작성 - 초기화 작업
//매개변수가 없는 생성자 선언 - 기본 생성자(Default Constructor)
// => 초기화 작업 미구현 - 객체 필드에 기본값이 초기값으로 저장
// => 기본 생성자를 선언하지 않으면 상속시 문제가 발생할 수 있으므로 기본 생성자를 선언하는 것을 권장
//이클립스를 사용하여 기본 생성자 선언 가능
// => [Ctrl]+[Space] >> 나열된 목록 중 Constructor 선택
public Member() {
// TODO Auto-generated constructor stub
}
// 매개변수가 있는 생성자 > 매개변수에 전달되어 저장된 값을 필드의 초기값으로 저장
// 인텔리제이를 사용하여 매개변수가 있는 생성자 선언 가능
// > [Alt]+[Insert] >>
public Member(String id) {
this.id = id;
}
public Member(String id, String name) {
super();
this.id = id;
this.name = name;
}
public Member(String id, String name, String email) {
super();
this.id = id;
this.name = name;
this.email = email;
}
//메소드 선언
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
//필드값을 확인하기 위해 필드값을 출력하는 메소드
public void display() {
System.out.println("아이디 = "+id);
System.out.println("이름 = "+name);
System.out.println("이메일 = "+email);
}
}
MemberApp
public class MemberApp {
public static void main(String[] args) {
// new 연산자로 Member 클래스의 매개변수가 없는 기본 생성자를 호출하여 객체 생성
// > 생성된 객체의 필드에는 기본값이 초기값으로 자동 저장
Member member1 = new Member();
// Getter 메소드를 호출하여 Member 객체의 필드값을 반환받아 출력
System.out.println("아이디 = " + member1.getId());
System.out.println("이름 = " + member1.getName());
System.out.println("이메일 = " + member1.getEmail());
System.out.println("------------------------------------");
// Setter 메소드를 호출하여 Member 객체의 필드값 변경
member1.setId("abc123");
member1.setName("홍길동");
member1.setEmail("abc@itwill.xyz");
/*
System.out.println("아이디 = " + member1.getId());
System.out.println("이름 = " + member1.getName());
System.out.println("이메일 = " + member1.getEmail());
이거를 보기편하게 하기위해 mamber에 적음
*/
member1.display();
System.out.println("==============================================================");
//new 연산자로 매개변수가 있는 생성자를 호출하여 객체 생성
Member member2=new Member("def456");
member2.display();
System.out.println("==============================================================");
Member member3=new Member("ghj789", "임꺽정");
member3.display();
System.out.println("==============================================================");
Member member4=new Member("xyz258", "전우치", "xyz@itwill.xyz");
member4.display();
}
}
아이디 = null
이름 = null
이메일 = null
------------------------------------
아이디 = abc123
이름 = 홍길동
이메일 = abc@itwill.xyz
==============================================================
아이디 = def456
이름 = null
이메일 = null
==============================================================
아이디 = ghj789
이름 = 임꺽정
이메일 = null
==============================================================
아이디 = xyz258
이름 = 전우치
이메일 = xyz@itwill.xyz