문법/기본 문법
자바 클라스와 객체(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([인자값]) : 생성자 호출