본문 바로가기

자바(JAVA)
[자바(Java)] 객체 지향 언어

<언어>

1. 절차적 언어
- 순서가 정해져 있다.
- C언어

2. 객체지향언어(OOP)
- Java, C++, Python ...
- ①추상화 ②상속 ③다형성 


기본 문법


- 매개 변수: method가 행위를 하는 재료가 됨
   ~ 형식 매개변수, 실질적 매개변수

package ex01.sample02;

public class Parameter {

	public static void main(String[] args) {
		int sum;
		sum = add(100, 200); //100, 200 : 실질적 매개변수
		// add(int a, int b); int a, int b : 형식적 매개변수 
		System.out.printf("100, 200의 add()의 결과는 : %d\n", sum);
	}

}


- 끝낼 때 꼭 ;(세미콜론) 붙이기

- 이름 뒤에 괄호() : 절차적 언어-함수 / 객체 지향 언어-메서드, 함수
    ~ 메서드: 무엇인가의 도움이 필요함.
            ex) b.a()
    ~ 함수: 무엇인가의 도움 없이 혼자 쓰일 수 있음
            ex) a()

- class ☞ object  method
    ~ System   out   println

- 위  를 보고 method가 object에 속한다고 생각할 수 있는데, 사실상 class에 속한다.
    ~ class는 값을 가질 수 없다. 값을 가질 수 있게 해주는 게 객체


객체 지향 언어

- new Calculator() 에서 Calculator()는 메서드의 형식을 띄고 있지만, 앞의 class명과 동일하기 때문에 생성자라고 칭함.
    ~ class를 생성하면 자동으로 생성자가 만들어진다.(default 생성자)

- 생성자와 메서드의 차이점: 생성자는 결과값을 반환하지 않는다.
- 생성자 | 메서드의 이름은 같지만 가지고 있는 자료형 타입이 다른 경우 : 생성자 | 메서드의 overloading

- 클래스 Scanner 오브젝트(객체) sc가 분리되어 떨어져 있다가 연산자 new 생성자 new Scanner()를 사용하면서 sc Scanner가 가지고 있는 기능을 가질 수 있게 된다.


// 클래스

- 추상형(추상화), 비어 있는 상자 (바로 사용하지 못 함! 사용하려면 객체가 필요)
- (같은 목적을 가진) 코드의 집합
- 데이터 집합
- 사용자 정의 자료형
- 데이터 구조 명확 > 같은 성질의 데이터를 저장하는 식별자(변수)가 서로 다른 이름을 사용하는 문제 해결
- 클래스의 객체(인스턴스)를 생성 : 
    ~ Point             p1           =            new            Point();
      클래스 참조변수(객체)  =  객체생성연산자  생성자();
           ※ p1은 정확히 말하면 참조변수, but 편의상 객체로 칭함.
  
- 클래스 : 붕어빵틀,  설계도,      사람,  포메라니언  
   객체 :      붕어빵,  제품,        홍길동,     똘이   

- 객체를 생성한 후 해당 클래스의 멤버에 접근하기 위해 '.'(멤버 접근 연산자) 사용
    ~ p1.y = 100;

a. 멤버 변수(필드) : 데이터가 저장되는 곳
    - 다른  package에 객체가 존재할 때는 디폴트 멤버 필드는 접근 불가능하다.
    - 객체를 생성할 때 멤버 변수도 같이 생성됨.★
        ~ Point p1 = new Point(); > 이 구문이 실행될 때 생성
    - 객체는 모든 참조가 끊기면  가비지가 된다. > 가비지 컬렉터가 객체 수거 > 객체를 소멸시킴 > 멤버 변수도 같이 소멸됨.★

b. 멤버 메서드 : 객체에 의해 호출시 실행
    - 자신만이 가진 데이터를 활용해서 행동해야 함(개성 있는 행동)
    - 웬만하면 멤버 변수를 활용해서 만드는 것이 좋다.


//생성자

- 객체의 상태(멤버 변수)를 초기화하는 역할 > 객체의 초기 상태를 개발자가 원하는 대로 설정이 가능하다.★
- 메서드명이 클래스명과 동일하다.(반드시)
- 반환형이 생략되어 있다. > 생성자라는 메서드는 반환값을 가질 수 없다.
- 생성자 내부: 클래스 멤버 변수를 초기화하는 코드 구현 (최소한의 의무)
- 자바는 개발자가 생성자를 선언하지 않으면, 자동으로 아래의 생성자를 생성함.
    public Cup() {
        this.color = null;
        this.size = 0;
    }
     ※명시적으로 생성자를 1개 이상 만들게 되면, 기본 생성자는 만들어지지 xxx

- 무조건 좋은 것은 아니다. 상황에 따라 좋을 수도 있고, 안 좋을 수도 있다.
- 매개변수를 사용하는 경우, 유효성 검사가 필요하다.


// ★★객체: 클래스가 가지고 있는 멤버 필드(데이터)와 멤버 메서드의 집합(구체화)
   - 객체는 클래스의 멤버 필드와 멤버 메서드를 공유한다 -> 접근할 수 있음!

- 함수나 메서드의 형태
1. int func1(int a)
2. int func1(void)
3. void func1(int a)
4. void func1(void)

- 컴포지션: 클래스 안에 다른 클래스의 객체를 생성


※객체 vs 인스턴스
- 객체, Object : 실존하고, 다른 객체와 구분되어지는 객체
- 인스턴스, Instance : 메모리에 실체화된 객체


// 메서드: 행위를 하는 것(결과값이 있다 == 실행에 의해 어떤 특정한 값을 얻을 수 있다.)  
   - 메서드, 함수(Function), 프로시저(Procedure), 서브루틴(subRoutine)
   - 반복적인 코딩의 내용을 간결하게 코딩하여 사용
   - 프로그램에서 제공하는 메서드, 사용자 정의 메서드
   - (같은 목적을 가진) 코드의 집합 > 동일한 목적을 가지는 동일한 코드가 2번 이상 반복되면 안 되기 때문★
   - 메서드끼리의 선언 순서는 상관 없다. (main은 맨 위에 두는 편)
   - 지역 변수, 전역 변수
   - 객체의 호출에 의해 사용됨.(객체.메서드())
      <->함수 : 자신 혼자서 사용

   1. 메서드 선언
     - 1회

   2. 메서드 호출
     - 무한대
     - 메서드 내의 코드 실현

   - 선언부 + 구현부
       ~ 선언부(시그니처,sign): (접근지정자 + 정적키워드 +) 반환자료형 + 메서드명 + 인자리스트 
       ~ 구현부(body): 메서드가 하려는 업무 코드 구현

       a. 메서드 인자리스트
         - 인자리스트, 인자(Arguments)
         - 파라미터(Parameters)
         - 매개변수
         - 메서드를 호출할 때 값을 전달해서, 메서드 내에서 사용할 수 있게 해주는 역할
         - 메서드 활용도를 높여준다. > 메서드 가용성 향상
         - 가인자 / 실인자

     b. 반환
         - 리턴문, 반환문
         - return 키워드 사용
         - return 뒤의 값 1개(★)를 돌려주는 역할.
         ※ 빈 리턴문 : 메서드를 종료한다.
             ~ void {return;}


// new 연산자: 객체를 생성한 후 바로 생성자를 호출 ==> 객체를 초기화
   ~ 객체 초기화: 필드를 초기화하거나 메서드도 사용할 준비를 하는 것
   ~ 객체뿐만 아니라 클래스가 가지고 있는 멤버 필드까지 초기화 시켜줌. 

ex) 전화: 클래스 / 9개의 버튼: 데이터 /9개의 버튼을 누름: 메서드

- 객체, 필드, 메서드, 생성자, 변수, 함수 => 초기화 순서에 따라 결과값이 변경된다.