반응형


자바는 객체 지향 프로그래밍 : 각각의 컴퓨터 부품을 만들고 그 부품들을 조립하여 컴퓨터를 만들 듯이 객체를 만들고 그 객체들을 

조립하여 소프트웨어를 만드는 기법이다.  


<특징>

-캡슐화 (encapsuation) : 관련된 데이터와 알고리즘(코드)이 하나의 묶음으로 정리 

-상속 : 이미 작성된 클래스(부모 클래스)를 이어 받아 새로운 클래스(자식 클래스)를 생성하며, 기존의 코드를 재사용할 수 있는 강력한 기법

-객체(Object) : 객체 지향 기술의 핵심 , 객체 안의 변수를 필드(field)라 부르고, 객체 안의 함수를 메소드(method)라 부른다

  하나의 객체는 필드와 메소드로 이루어진 SW묶음

-메세지(Message) : 객체는 메세지를 통해 다른 객체와 통신하고 상호 작용 / 매개변수(parameter)의 형태로 전달


Car.setSpeed(100);


Car : 메세지를 받는 객체

setSpeed : 매세지의 이름

(100) : 메세지의 매개변수


1.클래스(Class)

: 특정한 기능을 가진 객체를 생성하게 해주는 설계도

-클래스로 부터 만들어진 객체 : 해당 클래스의 인스턴스(instance) 


#예시

-자바에서는 일반적으로 하나의 소스 파일에는 하나의 클래스만을 담는 것이 원칙이다. 

 만일 하나의 파일에 여러 클래스가 있을 경우 클래스 중 main()이 들어있는 클래스의 이름과 소스 파일명이 같아야한다.


class Car{
    String color; //필드 정의
    int speed;
    int gear;
 
    void print(){ //메소드 정의
        System.out.println("<" + color + "," + speed + "," + gear + ">");
    }
}
 
class CarTest{
    public static void main(String[] args){
        Car myCar = new Car(); //객체 생성
 
        myCar.color = "red" ; //객체 필드 변경
        myCar.speed = 0;
        myCar.gear = 1;
 
        myCar.print(); //객체 메소드 
    }
}
cs


-클래스 구성요소

= 필드 : 객체의 데이터가 저장되는 곳, 데이터 선언 및 초기화 하는 공간(int fieldName;)

-객체의 고유 데이터, 상태 정보를 저장하는 곳

-생성자와 메소드 전체에서 사용되며 객체가 소멸되지 않는 한 객체와 함께 존재

-초기화 하지 않으면 각 자료형의 기본값으로 초기화 


<필드선언>

-생성자 선언과메소드 선언의 앞 뒤 어떤 곳에서도 필드 선언 가능

-단, 생성자와 메소드 내부에서는 선언될 수 없음(생성자, 메소드 내부의 변수 = 지역 변수)


<필드 선언>

-필드 값을 읽고 변경하는 작업

-클래스 내부에서는 단순히 필드 이름으로 읽고 변경

-클래스 외부에서는 클래스로부터 객체 생성 후 사용(일반적으로 직접 접근 못하게 캡슐화)


= 생성자 : 객체 생성 시 초기화 역할 담당, new 연산자(Car car = new Car;)

-new 연산자로 호출되는 특별한 중괄호 블록

-객체 생성 시 초기화 담당

-필드를 초기화하거나 메소드를 호출해서 객체를 사용할 준비

-클래스 이름으로 되어 있고 리턴 타입이 없음


<생성자 생성>

-생성자를 선언 안해도 기본적으로 컴파일시 디폴트 생성자가 생성됨

-생성자는 메소드와 비슷한 모양을 가지나, 리턴 타잆이 없고 클래스 이름과 동일

-클래스에 생성자가 명시적으로 선언되어 있을 경우 반드시 선언된 생성자를 호출해서 객체를 생성

-하나라도 인자값을 가진 다른 생성자를 호출할 경우 디폴트 생성자는 자동으로 생성되지 않으므로 디폴트 생성자를 호출하기 위해선 디폴트 생성자도 명시적으로 선언해줘야 함


<필드 초기화>

-필드를 선언할 때 초기값을 주면 동일한 클래스로부터 생성되는 객체들은 모두 같은 데이터를 가짐

-객체 생성 시점에 외부에서 제공되는 다양한 값들로 초기화 되어야 한다면 생성자에서 초기화 해야 함


<관례적으로 필드와 동일한 이름을 갖는 매개변수 사용>

-이 경우 필드와 매개변수 이름이 동일하므로 생성자 내부에서 해당 필드에 접근할 수 없다

-why? 동일한 이름의 매개 변수가 사용 우선순위가 높다. 따라서 this 를 사용한다.

-this는 객체 자신의 참조


<생성자 오버로딩>

-매개변수를 달리하는 생성자를 여러 개 선언하는 것

-오버로딩 시 주의점은 매개 변수의 타입과 개수 그리고 선언된 순서가 똑같을 경우 매개 변수 이름만 바꾸는 것은 오버로딩이라고 볼 수 없음


<다른 생성자 호출(this())>

-생성자 오버로딩이 많아질 경우 생성자 간의 중복된 코드 발생

-이 경우 필드 초기화한 내용은 한 생성자에만 집중적으로 작성하고 나머지 생성자는 초기화 내용을 가지고 있는 생성자를 호출하는 방법으로 개선

-생성자에서 다른 생성자 호출할 때 this() 코드 사용

-this()는 자신의 다른 생성자를 호출하는 코드, 반드시 생성자 첫줄에서만 허용


public Cat(String name, String breed){
    this.name = name;
    this.breed = breed;
}
public Cat(String name, String breed, int age){
    this(name,breed);
    this.age = age;
}
cs

= 메소드 : 객체의 동작에 해당하는 실행 블록 (void methodName(){..})


<클래스명 작성 규칙>

작성규칙

하나 이상의 문자로 이루어져야 한다

Car, SportsCar

첫 번째 글자는 숫자가 올 수 없다

Car, 3Car(x)

'$','_' 외의 특수 문자는 사용할 수 없다

$car, _Car, @Car(x), #Car(x)

자바 키워드(예약어)는 사용할 수 없다

int(x), for(x)

단일 단어 => 첫문자는 대문자 혼합 단어 => 각 단어 첫글자는 대문자


<메서드 선언>

[접근 제한자] [기타 제어자] 반환자료형 메서드명(매개변수){
    //return 리턴값;
}
cs

<메서드 선언부 = 메서드 시그너처>


<리턴 타입>

-메서드가 실행 후 리턴하는 값의 타입

-메서드 실행 후 결과를 호출한 곳에 넘겨줄 경우에는 리턴 값이 있어야 함

-리턴 값의 타입은 선언부의 반환자료형과 동일해야 함

-리턴 타입이 있다고 해서 반드시 리턴값을 변수에 저장할 필요 없음

-void 타입의 경우 리턴문 없이 사용 가능


<매개 변수의 수를 모를 경우>

-매개 변수를 배열 타입으로 선언

-… 으로 선언후 리스트 나열

public int sum(int ... args){
    return IntStream.of(args).sum();
}
cs



<메서드는 클래스 내/외부의 호출에 의해 실행>

-클래스 외부에서 호출할 경우 우선 클래스로부터 객체 생성
-클래스 참조변수 = new 클래스(매개값); * 참조변수.메서드(매개값); (리턴값 없거나, 받지 않을 경우) * 타입 변수 = 참조변수.메서드(매개값); (리턴값 받고 싶을 때)

<메서드 오버로딩>

-클래스 내에 같은 이름의 메서드를 여러 개 선언하는 것
-매개 변수의 타입, 개수, 순서 중 하나가 달라야 한다 (시그니처가 달라야 한다)


#예시

import java.util.Scanner;
 
public class InstanceMemberEx01 {
    int a, b; // 인스턴스 필드
    
    public InstanceMemberEx01(int c, int d) { // 생성자(필드 초기화)
        a = c; b = d;
    }
    
    public void add(){ // 인스턴스 메소드
        System.out.println(a+b); 
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("2개의 정수를 입력");
        int num1 = sc.nextInt();
        int num2 = sc.nextInt();
        InstanceMemberEx01 im = new InstanceMemberEx01(num1, num2); // 인스턴스 생성 및 생성자 호출
        im.add(); // 인스턴스 메소드 호출
    }
}
 
cs


##여기 까지 요약

1. 인스턴스 멤버(메소드, 필드)는 인스턴스를 생성해야지만 사용이 가능하다.(클래스멤버와의 차이점)
2. this는 자기 자신을 의미하는 키워드이다.
3. this.은 필드와 매개변수가 동일할 때 주로 사용되며 인스턴스 멤버임을 명확하게 해준다.
4. this()는 자기 자신의 생성자를 호출할 때 사용하며 호출하는 곳의 첫 번째 문장에 작성해야 한다.


2. 정적 멤버와 static

-정적(static)멤버는 클래스에 소속된 멤버(필드, 메소드) 의미

-static이라는 키워드가 붙은 필드 or 메소드가 정적 멤버이다.


<정적 멤버 선언>

-정적 필드 선언

static 타입 필드 [=초기값]; //static int a;
cs

-정적 메소드 선언

static 리턴타입 메소드([매개변수]){...}//static void sum(){..}
cs


-static으로 생성된 필드(전역 변수)는 static이라는 메모리 영역에 저장되어 프로그램이 종료될 때 까지 메모리상 남음

=몇 개의 인스턴스를 생성하든 클래스 당 단 1개의 값 가짐


public class StaticMemberEx01{
    static int a; //정적 필드
    int b;          //인스턴스 필드
 
    StaticMemberEx01(int a, int b){
        this.a = a; //매개값 할당
        this.b = b; //매개값 할당
    }
    public String print(){
        String value = "a : " + a + ", b : " +b;
        return value;
    }
    
    public static void main(String[] args){
        StaticMemberEx01 sm = new StaticMemberEx01(1,2); 
        StaticMemberEx01 sm1 = new StaticMemberEx01(2,3);
        StaticMemberEx01 sm2 = new StaticMemberEx01(3,4);
        System.out.println(sm.print()); // a : 3, b : 2
        System.out.println(sm1.print()); // a : 3, b : 3
        System.out.println(sm2.print()); // a : 3, b : 4
    }
}
  //인스턴스를 여러 번 생성하여도 메모리에서 한 번만 공간 할당하여 메모리 아
cs


반응형

'Language Study > Java' 카테고리의 다른 글

제주에서 자바_Week2_1  (0) 2019.07.22
제주에서 자바_Week1  (0) 2019.07.20
3. 참조 타입  (0) 2019.05.28
2. 조건문 & 반복문  (0) 2019.05.27
1. 타입, 연산자  (0) 2019.05.27

+ Recent posts