📘OOP

객체지향프로그래밍

객체 Object 지향 Oriented 프로그래밍 Programming OOP = 조립식 프로그래밍이다 , 객체를 조립하여 전체 프로그램을 만든다 OOP의 장점

  1. 관리 용이 = 문제 발생 시 , 특정 부분만 고치면 됨
  2. 재사용성 = 객체를 다른 프로그램에서도 사용 가능
  3. 확장 편리 = 기존 프로그램에 기능 추가하기 좋음

    클래스와 객체

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이란?

  1. static이란? static이란 “공유”의 개념이 담긴 키워드 이다
  2. 클래스 변수 클래스 변수(static fields) = “공유”를 위한 객체 외부 변수 vs 인스턴스 변수 (non-static fields) = 객체 내부에 존재하는 변서
    class Student{
     //클래스(공유)변수
     static int count = 0;
     //인스턴스(멤버)변수
     int id;
     String name;
    
  3. 클래스 메소드 클래스 메소드 ( static methods) = “클래스”가 동작시키는 메소드 =>간편 기능 구현에 유용 , Math.random(); //클래스 메소드의 경우, 주체객체 없이 클래스명으로 호출된다. vs 인스턴스 메소드(non-static methods) = “주 객체”가 동작하는 메소드 =>특정 객체의 동작 구현 시 유리 , abc.toStr(); //인스턴스 메소드는 먼저 주체 객체를 생성해야만 하고, 이를 통해 메소드 호출이 이루어진다.

태그:

카테고리:

업데이트: