객체(object)
란 물리적으로 존재하거나 개념적인 것 중에서 다른 것과 식별 가능한 것메소드 호출
해 데이터를 주고 받음매개값(파라미터)
: 객체가 전달하고자 하는 데이터
이며, 메소드 이름과 함께 괄호()안에 기술 set리턴값
: 메소드의 실행 결과, 호출한 곳으로 돌려주는 값 getpackage day0620;
class SportsCar1{
// 데이터
// 기능
}
class Tire1{
// 데이터
//기능
}
class Student{
// 데이터
String name;
//이름을 전달받아서 저장기능 => 메소드 void : 리턴값은 없고
public void setName(String name) { // String name은 저장받을 공간
this.name = name;
}
// 이름을 출력하는 기능
public String getName() {
return this.name;
}
}
public class Main{
public static void main(String[] args) {
SportsCar1 car = new SportsCar1(); //스포츠카 생성 내부에 있어서 이름 바꿔도 문제 x
Tire t1 = new Tire(); // 타이어 생성
//student 클래스 선언하고 학생 1명 객체 생성
Student stu1 =new Student();
Student stu2 =new Student();
stu1.setName("김자바");
String name1 = stu1.getName(); //name에 들어가서 출력 가능한지 봐보자
System.out.println(name1);
stu2.setName("이자바");
String name2 = stu2.getName(); //name에 들어가서 출력 가능한지 봐보자
System.out.println(name2);
}
}
new
클래스 변수 = new 클래스명();
stu1 = new Student(); //stu1 변수가 Student 객체를 참조합니다.
메소드를 가지고
있는 실행 가능한 클래스사용 관계
라이브러리 클래스 : Student2
이름(name)과 나이(age)를 가지고 있고 이름과 나이를 저장하고 출력하는 메소드를 가지고 있다.
Student2(){}
- 생성자 : 객체 생성시 초기화 역할을 담당하는 특수한 메소드이자 start 메소드
package day0620;
public class Student2 //라이브러리 클래스
{
String name;
int age;
Student2(){} // 생성자 : 객체 생성시 초기화 역할을 담당하는 특수한 메소드이자 start 메소드
// 메소드 : 객체의 동작으로 호출(이름을 불러줌)시 실행하는 블록
// name을 저장하는 setter 메소드
public void setName(String name) {
this.name = name;
} // 이 블럭이 사라지는 동시에 사라지기에 setter의 값은 사라지기에 name에 옮겨서 저장해줌
public void setAge(int age) {
// 클래스 내부에서 멤버 변수와 매개변수의 이름이 같을 경우, 매개변수로 전달된 값을 구분하기 위해 this 키워드를 사용
// this는 해당 객체 자신을 가리키는 참조로, 객체 내에서 멤버 변수에 접근할 때 사용
this.age = age; // 객체의 멤버 변수 age에 전달된 값 age를 할당하는 코드
} // 한 번 쓰고 버리는 값 => 저장하기 위해서는 데이터베이스와 연동
// name 잘 저장되었는지 확인 getter 메소드
public String getName() {
return this.name;
}
public int getAge(){
return this.age;
}
public void printInfo() {
System.out.println(this.name + "학생이며 나이는"+this.age);
}
}
실행 클래스 : StudentEx
package day0620;
public class StudentEx
{
public static void main(String[] args) //실행 라이브러리
{
// 객체 두 개 생성되며 따로 따로 저장 => Student2 클래스에서
Student2 stu1 = new Student2();
Student2 stu2 = new Student2();
stu1.setName("김선비");
stu2.setName("최단비");
stu1.setAge(15);
stu2.setAge(17);
stu1.printInfo();
stu2.printInfo();
}
}
(.)
연산자라이브러리 클래스
: Studentpackage day0620_2;
public class Student
{
String name;
String subject;
int fee;
double returnFee;
// 같은 이름을 가진 메소드를 () 안에 파라미터나 타입을 달리 해서 다양한 형태로
// 사용 가능 => 메소드 오버로딩
Student(){} //기본생성자
Student(String name, String subject, int fee){
this.name = name;
this.subject = subject;
this.fee = fee;
}
public void calcReturnFee(String subject) {
int resultFee = 0;
if(subject.equals("javaprogram")) {
resultFee =this.fee/4;
}
else if(subject.equals("jspprogram")) {
resultFee = this.fee/5;
}
else {
System.out.println("그런 과정명은 없습니다.");
}
}
public void print() {
System.out.println(this.name +"씨의 과정명은 "+this.subject+"이고 "+this.fee +"이며 "+ "환급금은 "+this.returnFee+"입니다.");
}
}
실행 클래스
: Mainpackage day0620_2;
public class Main
{
public static void main(String[] args)
{
Student st1 = new Student("이ㅇㄹ","javaprogram",30);
st1.calcReturnFee(st1.subject);
st1.print();
Student st2 = new Student("서유미","javaprogram",40000);
st2.calcReturnFee(st2.subject);
st2.print();
Student st3 = new Student("ㄴㄴㄴ","Engliesh",58000);
st3.calcReturnFee(st3.subject);
st3.print();
}
}
package day0620_2;
public class Calculator
{
int num1, num2, result;
Calculator(){} //기본생성자
Calculator(int n1, int n2){ // 클래스는 객체 생성 => 데이터를 조작하는 작업 공
this.num1 = n1;
this.num2 =n2;
}
public int add() {
int result = num1 + num2;
return result;
}
public int sub() {
int result = 0;
if(num1>num2)
result = num1 - num2;
else result = num2 - num1;
return result;
}
public int multi() {
int result = num1 * num2;
return result;
}
public int div() {
int result = 0;
if(num2>0) {
result = num1 / num2;}
else System.out.println("0으로 나눌 수 없습니다.");
return result;
}
}
package day0620_2;
public class Main1
{
public static void main(String[] args)
{
Calculator cal = new Calculator(10, 20);
System.out.println(cal.add());
System.out.println(cal.sub());
System.out.println(cal.multi());
System.out.println(cal.div());
}
}
new 연산자로 객체 생성시 객체의 초기화 역
객체 생성 시 호출되는 특수한 메소드로 new 연산자가 객체가 생성자 이용하여 객체 생성
Book book = new Book();
생성자의 특징
반환형(리턴 타입)이 없는
형태디폴트 생성자
생성자 명이 클래스명과 같다
단 생성자 오버로딩이 되있다면 반드시 개발자는 디폴트생성자를 만들어줘야 한다.
클래스(){};
생성자 선언
객체를 다양하게 초기화하기 위해 생성자를 직접 선언
할 수 있음
클래스(매개변수, ...){
}
메소드 선언
리턴타입 메소드명(매개변수,...){
실행할 코드를 작성하는 곳..
}
boolean login(String i, String p) {
if(i.equals("hong")&&p.equals("12345")) {
return true;
}
else return false;
}
Car
package day0620_2;
public class Car
{
int gas;
void setGas(int gas)
{ // 리턴 값이 없는 메소드 매개변수 gas를 받아서 객체 변수 this.gas에 저장
this.gas = gas;
}
// 리턴값이 boolean인 메소드로 gas 필드값이 0이면 false 0이 아니면 true를 리턴하는 isLeftGas()
boolean isLeftGas()
{
if (gas == 0)
{
System.out.println("가스가 없다.");
return false;
} else
{
System.out.println("gas가 있습니다.");
return true;
}
}
// 리턴값이 없는 메소드로 run(), gas 필드값이 0이면, return 문으로 메소드 종료
void run()
{ // 리턴값이 없다 = void
while (true)
{
if (gas > 0)
{
System.out.printf("달립니다.(gas잔량: %d)\n", this.gas);
gas -=1;
}
else {
System.out.printf("멈춥니다.(gas잔량: %d)\n", this.gas);
return; //리턴값이 없이 return만 적는다면 강제 종료
}
}
}
}
CarEX
package day0620_2;
public class CarEx
{
public static void main(String[] args)
{
// 1. Car 객체 생성
Car mycar = new Car();
//2. gas 주입
mycar.setGas(5);
//mycar.isLeftGas();
// 3, 실행
if(mycar.isLeftGas()) {
System.out.println("출발합니다.");
mycar.run();
}
System.out.println("gas를 새로 주입해주세요.");
}
}
public class MemberService
{
String name;
String id;
String password;
int age;
MemberService(){}
MemberService(String id, String password){
this.id = id;
this.password = password;
}
boolean login(String id, String password) {
if(this.id.equals(id) && this.password.equals(password)) {
return true;
}else {
return false;
}
}
void logout(String id) {
System.out.println(id + "님이 로그아웃 하셨습니다.");
}
}
package quiz0620;
import java.util.Scanner;
public class MemberServiceEx
{
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
System.out.println("회원가입");
System.out.println("id를 입력하세요");
String id = in.next();
System.out.println("비밀번호를 입력하세요.");
String pwd = in.next();
MemberService m1 = new MemberService();
System.out.println("회원 가입완료되었습니다. 로그인 하시려면 아이디와 패스워드를 입력해 주세요.");
System.out.println("id를 입력하세요.");
id = in.next();
System.out.println("비밀번호를 입력하세요");
pwd = in.next();
boolean login = m1.login(id, pwd);
if(login) System.out.println("로그인 성공");
else System.out.println("로그인 실패");
m1.logout(id);
}
}
1. 객체와 클래스에 대한 설명으로 틀린 것? 3
- 클래스는 객체를 생성하기 위한 설계도와 같은 것이다.
- new 연산자로 클래스의 생성자를 호출함으로써 객체가 생성된다.
- 하나의 클래스로 하나의 객체만 생성할 수 있다. => 여러 개 생성 가능
- 객체는 클래스의 인스턴스이다.=> 해당 클래스에 적재되었다라는 느낌
2. 클래스 구성 멤버가 아닌 것은? 4
- 필드
- 생성자
- 메소드
- 로컬 변수 => 메소드 안의 지역 변
3. 필드, 생성자, 메소드에 대한 설명으로 틀린 것? 4
- 필드는 객체의 데이터를 저장
- 생성자는 객체의 초기화 담당
- 메소드는 객체의 동작 부분으로 실행 코드를 가지고 있는 블록
- 클래스는 반드시 필드와 메소드를 가져야 한다. => 반드시는 아님
4. 필드에 대한 설명으로 틀린 것? 3
- 필드는 메소드에서 사용 가능
- 인스턴스 필드 초기화는 생성자에서 가능
- 필드는 반드시 생성자 전에 선언 => x 어디서든 가능
- 필드는 초기값을 주지 않더라도 기본값 자동 초기화
5. 생성자에 대한 설명으로 틀린 것은?
- 객체 생성 시 생성자 호출이 반드시 필요한 것은 아니다. => 필요
- 생성자는 다른 생성자 호출을 위해 this() 사용 가능
- 생성자가 선언되지 않으면 컴파일러가 기본 생성자 추가
- 외부에서 객체 생성할 수 없도록 생성자에 private 접근 제한자 붙일 수 있음
6. 메소드에 대한 설명으로 틀린 것? 4
- 리턴값이 없는 메소드는 리턴 타입 void로 해야함
- 리턴 타입 있는 메소드는 리턴값을 지정하기 위해 반드시 return 문 필요
- 매개값 수를 모르면“...”이용해서 매개변수 선언 가능
- 메소드 이름 중복 선언 불가 => 메소드 오버로딩으로 가능
필드를 사용
할 수 있음인스턴스 멤버
로 선언이 되면 객체 생성 후 사용 가능인스턴스 멤버에 접근하기 위해
사용되는 명령어this
라고 가르킨다.공용의 의미
로 적용하면 편리한 기능 제공정적멤버
선언되면 객체생성 없이 사용 가능static double pi = 3.14159; //static 키워드 붙여지면 정적멤버
final static String model ="LED1900";
final 타입 필드 = 초기값;
필드 선언
시 초기값 대입생성자
에서 초기값 대입package day0620_2;
public class Television
{
static String company = "SAMSUNG"; //누구나 봐야 하는 거기에 static
final static String model ="LED1900"; // 읽기만 가능 쓰기 불가 => 값 변경 불가
static String info;
int speed; // static 안에 사용 불가 메모리 공간이 다르기 때문
void m1() {}
static {
String menu ="TV 메뉴 안내 입니다."; // 메모리 공간이 같아서 사용가능
info = company + "-" +model;
//m1(); 정적멤버와 인스턴스 멤버는 같은 공간에서 사용 불가 => main에서만 가능
}
}
package day0620_2;
public class Main
{
public static void main(String[] args)
{
// 1. static 부르기
System.out.println(Television.info); //어디서든 출력 가능 => 원래대로라면 객체 생성했어야 하는디
// 2. 객체 만들기 main에서만 1과 2를 혼재해서 사용 가능
Television t1 = new Television();
int s = t1.speed;
}
}
static final 타입 상수 = 초기값;
.
으로 구분import 문
을 이용해서 어떤 패키지의 클래스를 사용하는지 명시클래스의 전체 이름을 기술
package javastudy1.day0620.hyundai;
import javastudy1.day0620.hankook.Tire;
import javastudy1.day0620.kumho.AllSeasonTire;
//import javastudy1.day0620.kumho.Tire;
public class Car
{
javastudy1.day0620.hankook.Tire tire1 = new javastudy1.day0620.hankook.Tire();
javastudy1.day0620.kumho.Tire tire2 = new javastudy1.day0620.kumho.Tire ();
Tire t3 = new Tire();
AllSeasonTire t4 = new AllSeasonTire();
}
객체의 무결성
을 유지하기 위해서 접근 제한자 사용public
: 클래스, 필드, 생성자, 메소드 ⇒ 제한 범위 : 없음(같은 패키지도 다른 패키지도 사용 가능)protected
: 필드, 생성자, 메소드 ⇒ 제한 범위 : 같은 패키지이거나 자식 객체
만 사용 가능같은 패키지
private
: 필드, 생성자,메소드 ⇒ 제한범위 : 객체 내부
(=클래스 내부)private로 된 필드의 경우 필드에 한 해서
getter, setter
해주면 a.getF3(), a.setF3() 느낌으로 간접 접근은 가능하다. ⇒ 간접 접근 방식
⇒ 필드나 메서드는 어디에서나 읽거나 호출할 수 있는 것이 아니고, 어떤 접근제한자를 갖느냐에 따라 호출 여부나 접근 여부가 결정
생략시
다른 패키지에서 사용 불가**public class Student
{
private String name;
private String subject;
private int fee;
private double returnFee;
public Student(){};
public Student(String name, String subject, int fee){
this.name = name;
this.subject = subject;
this.fee=fee;
}
public void calcReturnFee() {
if(subject.equals("javaprogram")) {
returnFee = (double)fee/4;
}
else if(subject.equals("jspprogram")){
returnFee = (double)fee/5;
}
}
public void print() {
System.out.printf("%s씨의 과정명은 %s이고 교육비는 %d이며 환급금은 %.1f입니다.", name, subject, fee, returnFee);
}
public static void main(String args[]){
Student stu = new Student("장동건", "jspprogram", 500000);
stu.calcReturnFee();
stu.print();
}
}**
package moringquiz0621;
public class Account {
private int balance;
private static final int MIN_BALANCE = 0;
private static final int MAX_BALANCE = 1000000;
public Account() {
}
public Account(int balance) {
setBalance(balance);
}
public int getBalance() { //값이 밖에 보이기 위한 작업 반환이 꼭 있어야 함
return balance;
}
public void setBalance(int balance) { //값을 세팅하면서 받고
if (balance < MIN_BALANCE || balance > MAX_BALANCE) {
return; //초과시 balance값 유지
}
this.balance = balance;
}
public static void main(String[] args) {
Account account = new Account();
account.setBalance(10000);
System.out.println("현재 잔고: " + account.getBalance());
account.setBalance(-100);
System.out.println("현재 잔고: " + account.getBalance());
account.setBalance(2000000);
System.out.println("현재 잔고: " + account.getBalance());
account.setBalance(30000);
System.out.println("현재 잔고: " + account.getBalance());
}
}
생성자를 private 접근 제한
해서 외부에서 new 연산자 호출할 수 없다.
public class 클래스{
private static 클래스 singletone = new 클래스();
private 클래스() {};
public static 클래스 getInstance() {
return singletone;
}
}
public class SingleToneTest
{
private static SingleToneTest singletone = new SingleToneTest();
private SingleToneTest() {}
public static SingleToneTest getInstance() {
return singletone;
}
}
public class Main
{
public static void main(String[] args)
{
// 정적 메소드를 호출해서 싱글톤 객체를 얻어온다.
SingleToneTest obj1 = SingleToneTest.getInstance();
SingleToneTest obj2 = SingleToneTest.getInstance();
if(obj1==obj2) {
System.out.println("같은 객체값");
}
else System.out.println("다른 객체값");
}
}
TMI이지만 6월 20일은 내 생일이었다. 친구들이랑 생일 파티도 하고 다른 친구들이랑 근로에서 만나게 된 사람들한테까지 선물과 축하를 받아서 행복한 하루였다.
강의에 대한 회고를 하자면.. 오늘은 사람들이 전부 힘겨운 날이었나보다. 강사님께서도 그걸 느끼셨는지 쉬는 시간을 5분정도 더 주셨다.. 나도 일주일 내내 온전히 쉬는날이 없어서 인가 조금 지치긴 했다. 그래도 나는 과제는 밤새서라도 하는 주의라서 생일 파티하고 와서 밤 12시부터 새벽 4시까지 과제 해서 냈다.
공부하는 건 힘들지만 뭔가를 배운다는 건 두근거리고 좋은 일 같다. 어느정도 자바 떼고 나면 인프런 강의 듣는 것도 욕심 내보고 싶다. 주말에 강의 들으면서 복습 & 새로운 기술 공부 좀 해야지 화이팅!!!