문법/기본 문법

자바 클라스와 객체(0118)

코딩 화이팅 2023. 1. 18. 13:12

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

  • 객체 : 사물과 같이 유형적인 것과 개념이나 논리와 같은 무형적인 것들(개념으로 부분적으로 인식할 수 있는 것들)
  • 객체 단위로 나누어서, 객체 간의 상호작용으로 프로그래밍하는 것
  • 객체 모델링 : 현실세계의 객체를 SW객체로 설계하는 것 ex)학사 관리 시스템
    학생 클래스 : 전공, 수강신청 등
    과목 클래스 : 담당교수, 커리큘럼, 장소
    교수님 클래스 : 수업
    교직원 클래스 : 문의  
  • SW객체 : 속성-데이터-변수
                    행위-알고리즘-메서드
  • 절차적 프로그래밍 : main 함수 안에 모든 로직을 집어넣는 것
  • 객체지향 프로그래밍 장점 : 안정적 / 대규모 프로젝트 / 협업에 유리 / 모듈화된 프로그래밍 / 재사용성이 높다.

특징

  • 추상화 : SW목적에 맞게 필요한 속성만 추출해내는 작업
  • 다양성 : 하나의 객체를 여러 관점에서 볼 수 있는 작업
  • 상속 : 이전의 설계도를 사용하여 현재의 작업을 하는 것
  • 캡슐화 : 객체 안에 데이터와, 알고리즘이 캡슐처럼 묶여있다./ 정보 은닉
package test01;

//모든 클래스는 특정 패키지(폴더)에 속해 있다.
//패키지 : 클래스가 모여있는 폴더
//클래스 만들 때 : class키워드 사용
public class person {
	// 속성, 데이터, 필드, 변수
	String name;//인스턴스 변수
	int age;//인스턴스 변수

	// 생성자
	// 클래스명과 같다.
	// 반환형을 지정 x(메서드와 다름)
	public person() { //person : 생성자
	}


	public void eat() { //메서드
		System.out.println(name+"이 식사를 합니다.");
	}
	}
package test01;

public class persontest {
	public static void main(String[] args) {
		person p1=new person();//객체의 생성:new 키워드+생성자 호출
		p1.name="강현";
		p1.age=26;
		p1.eat();//강현이 식사를 합니다.
		
		person p2=new person();
		p2.name="강현2";
		p2.age=27;
		p2.eat();//강현2이 식사를 합니다.
	}
}

클래스

  • 객체를 만드는 설계도
  • 인스턴스 : 클래스를 통해 생성된 객체를 통해 데이터(인스턴스별로 고유하다)알고리즘을 가지게 된다.
  • 관련 있는 변수와 함수를 묶어서 만든 사용자정의 <자료형> ex)String, int
  • 모든 객체들의 생산처
  • 클래스==객체를 생성하는 틀
  • 각 객체들이 어떤 특징(속성과 동작)을 가지고 있을지 결정

구성

  • 속성-필드
  • 동작-메소드
  • 생성자 : 객체를 생성할 때 호출하는 것
  • 중첩 클래스
package test02;

public class person {
	//static 키워드->클래스 변수->이 클래스로 생성되는 모든 인스턴스가 공유
	static String species="호모 사피엔스 사피엔스 사피엔스";
	
	//static이 없다면 인스턴스 변수
	String name;
	int age;
	
	//생성자 만들지 않고
	//만약에 설계도에 생성자가 하나도 없다면
	//JVM이 기본생성자를 추가해줌
	public void eat() {
		//지역 변수
		String dish="자장면";
	}
}
package test02;

public class persontest {
	public static void main(String[] args) {
		person p1=new person();
		person p2=new person();
		person p3=new person();
		
		System.out.println(person.species);//클래스 변수이므로 클래스명.으로 접근가능
		System.out.println(p1.species);
		System.out.println(p1.species);
		System.out.println(p1.species);
	}
}
//호모 사피엔스 사피엔스 사피엔스
//호모 사피엔스 사피엔스 사피엔스
//호모 사피엔스 사피엔스 사피엔스
//호모 사피엔스 사피엔스 사피엔스
//출력

변수

클래스 변수

  • 설계도에 들어가 있는 변수
  • 클래스 영역 선언(static 키워드)
  • 모든 인스턴스가 공유함(해당 클래스로 생성됨)

인스턴스 변수

  • 인스턴스가 생성됐을 때 생성
  • 인스턴스 별로 생성됨(각 인스턴스가 고유하게 가짐)

지역변수

  • 클래스 영역 이외
package test03;

public class person {
	//static 키워드->클래스 변수->이 클래스로 생성되는 모든 인스턴스가 공유
	static String species="호모 사피엔스 사피엔스 사피엔스";
	
	//static이 없다면 인스턴스 변수
	String name;
	int age;
	
	//생성자 만들지 않고
	//만약에 설계도에 생성자가 하나도 없다면
	//JVM이 기본생성자를 추가해줌
	
	public int add(int a, int b) {
		return a+b;
	}
	
	//메서드의 종료-블록의 끝을 만날 때 / return문을 만날 때(void에서도 return쓸 수 있다)
	
	public void study(String subject) {
		double probability=Math.random();
		System.out.println(subject+"를 공부합니다.");
		System.out.println("알고리즘 문제를 풉니다.");
		if (probability<0.9999) {//99.99퍼센트로 return을 만나 메서드가 종료됨.
			return;
		}
		//여기서부터는 0.01프로로 실행ㅋㅋ
		System.out.println("게임을 합니다.");
		System.out.println("롤 영상을 본다.");
	}
	
	//메서드 오버로딩
	public void eat() {
		System.out.println("식사를 합니다");
	}
	public void eat(String dish) {
		System.out.println(dish+"를 먹습니다.");
	}
	public void eat(String dish, int times) {
		System.out.println(dish+"를" +times+"에 먹습니다.");
	}
    public int add(int a, int b) {
		return a+b;
	}
	public double add(double a, double b) {
		return a+b;	
	}

}
package test03;

public class persontest {
	public static void main(String[] args) {
		person p1=new person();
		int sum=p1.add(4, 5);
		double sum1=p1.add(34.2, 101.1);
		System.out.println(sum);//9 출력
		System.out.println(sum1);//135.3 출력
		p1.study("자바");//자바를 공부합니다\n 알고리즘 문제를 풉니다. 출력
	}
}

메서드

  • 특정한 작업을 수행하는 문장들을 묶어서 이름을 붙인 것
  • 객체가 할 수 있는 행동을 정의
  • 메소드의 이름은 소문자로 시작
  • 반환값이 꼭 있어야함

메서드 오버로딩

  • 이름이 같고 매개변수가 다른 메소드를 여러 개 정의하는 것
  • 파라미터의 개수 도는 순서, 타입이 달라야할 것(파라미터 이름만 다른 것은 X)
  • 리턴 타입이 다른 것은 의미X

생성자

생성자 메서드

  • 결과형 리턴값을 갖지 않음(void도 쓰지 않음)
  • new 키워드와 함께 호출하여 객체 생성
  • 클래스명과 동일
  • 객체가 생성될 때 반드시 하나의 생성자 호출
  • 멤버변수의 초기화에 주로 사용
  • 하나의 클래스 내부에 생성자가 하나도 없으면 자동적으로 default 생성자가 있는 것으로 인지
    default 생성자 : 매개 변수도 없고 내용도 없는 생성자
  • 매개변수의 개수가 다르거나, 자료형이 다른 여러개의 생성자가 있을 수 있음(생성자 오버로딩)
  • 생성자의 첫번째 라인으로 this() 생성자를 사용하여 또 다른 생성자를 하나 호출 가능

파라미터가 있는 생성자

  • 생성자의 목적이 필드 초기하
  • 생성자 호출 시 값을 념거주어야 함.
  • 해당 생성자를 작성하면 JVM에서 기본 생성자를 추가하지 않음.
package test06;

public class person {
	//static 키워드->클래스 변수->이 클래스로 생성되는 모든 인스턴스가 공유
	static String species="호모 사피엔스 사피엔스 사피엔스";
	
	//static이 없다면 인스턴스 변수
	String name;
	int age;

	
	//생성자 만들지 않고
	//만약에 설계도에 생성자가 하나도 없다면
	//JVM이 기본생성자를 추가해줌
	
	//파라미터가 있는 생성자
	
	public person() {
		this("강현삼", 29); //person생성자 안에 인스턴스에 값을 넣어줌
	}
	
	public person(String name, int age) {
		//this 키워드: 인스턴스의 멤버에 접근
		this.name=name;
		this.age=age;
	}
	
	//메서드 오버로딩 : 이름이 같은 메서드 여러개를 만들 수 있다.
	//단 파라미터가 달라야함
	public int add(int a, int b) {
		return a+b;
	}
	public double add(double a, double b) {
		return a+b;
	}
	//메서드 오버로딩의 장점 : 다양한 자료형에 대해 메서드를 만들 때 이름을 똑같이 할 수 있음
	
	//메서드의 종료-블록의 끝을 만날 때/return문을 만날 때(void에서도 return쓸 수 있다)
	public void study(String subject) {
		double probability=Math.random();
		System.out.println(subject+"를 공부합니다.");
		System.out.println("알고리즘 문제를 풉니다.");
		if (probability<0.9999) {
			return;
		}
		
		System.out.println("게임을 합니다.");
		System.out.println("롤 영상을 본다.");
	}
	
	public void sleep() {
		System.out.println("잠을 잡니다.");
	}
	
	public void eat() {
		System.out.println("식사를 합니다");
		this.sleep();//eat 호출시 위에 sleep 메소드도 같이 출력
	}
	public void eat(String dish) {
		System.out.println(dish+"를 먹습니다.");
	}
	public void eat(String dish, int times) {
		System.out.println(dish+"를" +times+"시에 먹습니다.");
	}
}
package test06;

public class persontest {
	public static void main(String[] args) {
		person p1=new person("강현", 26);
		person p2=new person("강현일", 27);
		person p3=new person("강현이", 28);
		person p4=new person();
		
		p1.eat();//식사를 합니다 \n잠을 잡니다. 출력
		System.out.println(p1.name); //강현
		System.out.println(p1.age); //26
		System.out.println(p2.name); //강현일
		System.out.println(p3.name); //강현이
		System.out.println(p4.name); //강현삼
//		int sum=p1.add(4, 5);
//		double sum1=p1.add(34.2, 101.1);
//		System.out.println(sum);
//		System.out.println(sum1);
//		p1.eat();
//		p1.eat("탕수육");
//		p1.eat("탕수육", 3);
	}
}

this

  • 참조 변수로써 객체 자신을 가리킴
  • this를 이용하여 자신의 멤버 접근 가능(변수, 메서드 접근 가능)
  • 지역변수(매개변수)와 필드의 이름이 동일할 경우 필드임을 식별할 수 있게 함.
  • 객체에 대한 참조이므로 static영역에서 this 사용 불가
    static : 클래스 범위/설계도
  • this.멤버변수
  • this([인자값]) : 생성자 호출