객체지향프로그래밍과 클래스 종류
📘OOP
객체지향프로그래밍
객체 Object 지향 Oriented 프로그래밍 Programming OOP = 조립식 프로그래밍이다 , 객체를 조립하여 전체 프로그램을 만든다 OOP의 장점
- 관리 용이 = 문제 발생 시 , 특정 부분만 고치면 됨
- 재사용성 = 객체를 다른 프로그램에서도 사용 가능
- 확장 편리 = 기존 프로그램에 기능 추가하기 좋음
클래스와 객체
class(클래스)(설계도) /인스턴스화->/ object(객체)(인스턴스) ==> program 설계도를 가지고 객체를 생성한다. 그 각각의 객체들을 가지고 한 프로그램을 만들수있다. 클래스 = 객체를 만들기 위한 설계도 객체 = 프로그램을 구성하는 무언가 인스턴스화 = 클래스를 통해 객체를 만드는 것 필드 = 객체의 상태(또는 데이터) 메소드 = 객체의 동작(또는 기능)
클래스의 구성요소
fields(상태) = 해당 클래스의 이름, 무게 등등 methods(동작) = 해당 클래스의 동작들(잠자기, 물마시기) 클래스 만드는법 1.클래스를 만든다 2.필드를 작성한다 3.메소드를 정의한다
생성자와 디폴트 생성자
클래스 사용 예 ( 사용자 , 디폴트 생성자 , 객체를 파라미터로 전달한 경우)
해당 클래스를 객체로 생성하는 방법
class abc{
//필드
String name;
int hp;
//생성자
abc(String n, int p){
name = n;
hp = p;
}
abc(){} //디폴트 생성자(생성자가 하나라도 있기 때문에 디폴트 생성자를 정의해 줘야함)
//메소드
void toStr(){
~~~
}
void eat(abc target){
System.out.println("%s를먹다,target.name) // 객체를 파라미터로 전달한 경우
}
} // 클래스 작성
Main{
abc A = new abc(); // 메인에서 A객체 생성
abc B = new abc(a,b); // 메인에서 B객체 생성 // 두개의 설계도는 똑같음
}
여기서 abc()란 생성자이다. (생성자 = 클래스로부터 객체를 생성하는 특별한 메소드) 생성자는 객체 생성, 초기화 를 시켜준다 호출 클래스_타입 변수명 = new 클래스_이름(전달값); 정의 클래스_이름(파라미터) { 리턴타입X } 여기서 A는 디폴트 생성자이다. 디폴트 생성자는 생성자가 없는경우 디폴트 생성자가 자동 기입 되지만, 생성자가 하나라도 있는경우에는 디폴트 생성자가 기입 되지 않는다. 뒤에 코드에 A의 name 과 hp를 넣어줘야함 –> A.name = “a”; A.hp = 1;
//객체 또한 파라미터로 전달 가능 eat이라는 함수가 abc객체를 파라미터로 전달한 경우이다.
객체 조합하기
객체 조합하기 한 객체 내부에 또 다른 객체들이 존재할 수 있다.
class Team{
String nation; // 국가
Player[] players; // 선수들 (객체 배열)
}
클래스 종류
inner 클래스
클래스 안의 클래스
class A{ // 외부 클래스 class B{ // 내부 클래스 } }
내부 클래스의 장점
- 내부 클래스에서 외부 클래스의 멤버들을 쉽게 접근할 수 있다.
- 코드의 복잡성을 줄일 수 있다.(캡슐화)
public class InnerExam1{
class Cal{ //inner class
int value = 0;
public void plus(){
value++;
}
}
public static void main (String() args) {
InnerExam1 t = new InnerExam1();
InnerExam1.Cal cal = t.new Cal ();
cal.plus();
System.out.println(cal.value);
}
}
static 클래스
정적 중첩 클래스
public class InnerExam2{
static class Cal{
int value = 0;
public void plus(){
value++;
}
}
public static void main (String() args) {
InnerExam2.Cal cal = new InnerExam2.Cal();
cal.plus();
System.out.println(cal.value);
}
}
local 클래스
지역 중첩 클래스
public class InnerExam3{
public void exec(){
class Cal{
int value = 0;
public void plus(){
value++;
}
}
Cal cal = new Cal();
cal.plus();
System.out.println(cal.value);
}
public static void main (String() args) {
InnerExam3 t = new InnerExam3();
t.exec();
}
}
익명 중첩 클래스(추상클래스(abstract))
public abstract class Action(){
public abstract void exec();
}
public class MyAction extends Action{
public void exec(){
System.out.println("exec");
}
}
public class ActionExam{
public static void main(String[] args){
//Action action = new MyAction();
//action.exec(); //보통이렇게 쓰지만 익명클래스는 다르다
//MyAction이라는 클래스를 안만들어도 된다.(다른클래스에서 전혀 사용하지않는 경우)
Action action = new Action(){
puvlic void exec(){
System.out.println("exec");
}
};
action.exec();
}
레퍼런스란?
레퍼런스형(references type) -클래스 타입 -사용자 정의형 타입 ==> 객체 연결을 위한 타입
Cat 레퍼런스타입(클래스타입)cat1 (레퍼런스 변수)= new Cat(); (int score(기본변수) =8 ;
static이란?
- static이란? static이란 “공유”의 개념이 담긴 키워드 이다
- 클래스 변수
클래스 변수(static fields) = “공유”를 위한 객체 외부 변수
vs
인스턴스 변수 (non-static fields) = 객체 내부에 존재하는 변서
class Student{ //클래스(공유)변수 static int count = 0; //인스턴스(멤버)변수 int id; String name;
- 클래스 메소드 클래스 메소드 ( static methods) = “클래스”가 동작시키는 메소드 =>간편 기능 구현에 유용 , Math.random(); //클래스 메소드의 경우, 주체객체 없이 클래스명으로 호출된다. vs 인스턴스 메소드(non-static methods) = “주 객체”가 동작하는 메소드 =>특정 객체의 동작 구현 시 유리 , abc.toStr(); //인스턴스 메소드는 먼저 주체 객체를 생성해야만 하고, 이를 통해 메소드 호출이 이루어진다.