JAVA

<Java> 기초 문법 공부 2

Unknown200 2021. 3. 28. 21:35

[객체 지향 프로그래밍(Object-Oriented Programming/OOP)]

객체 : 프로그래밍에서 속성과 기능을 가지는 프로그램 단위
ex)
날씨 프로그램:
속성:온도,미세먼지

기능:날씨예보,

사칙연산 프로그램:
속성 : + - * /
기능:연산가능

<클래스 : 객체를 생성하기 위한 틀로 모든 객체는 클래스로부터 생성된다.>

<클래스 구성요소>
속성(멤버변수)와 기능(메서드)로 구성

[클래스 제작과 객체 생성]

<클래스 제작>

멤버변수(속성), 메서드(기능), 생성자

* 메소드(기능)== 함수

ex) public void(반환값의 자료형) run() { <--------메소드 기능

-------run-----

}

생성자 : 클래스 이름과 동일한 이름을 가진 메소드

public (클래스이름)(){

}

ex)
public class Phone<---클래스 이름

public String color<----멤버 변수

public Int price;

public Phone() { <----생성자

Sout("phone constructor");

}

public void run() {  <-----메서드 기능

sout(----run---);

sout(""color : ", +color);

sout("price:", +price);

}

public void stop(){   <-----메서드 기능

sout(----stop----);

}

<객체생성>

클래스로부터 new 를 사용해서 객체 생성

ex) Phone phone = new Phone();

phone.color = "red";

phone.price= "30000";

결과:
Phone constructor

---run---

color:red

price:30000

 

----stop----

 

 

레퍼런스 : 생성한 객체의 주소를 변수에 담는 것

-> 가리키고 있다, 참조하고 있다. 참조하고 있다.

<기본 생성자를 사용한 출력>

Phone phone = new Phone();

phone.color="red";

phone.price=300;

phone.run();

phone.stop();

결과

phone constructor

---run---

color:red

price : 300

----stop----

<파라미터가 들어간 생성자>

Phone phone = new Phone(String a, int b);

color = a;

prive = b;

Phone phone = new Phone("red", 300);

결과 : 

---run---

color:red

price:300

[method(메소드)]

<메소드 선언과 호출 : 변수와 같이 선언 및 정의 후 필요시에 호출해서 사용한다>
접근자(public ) / 반환형(void) / 메소드이름(getRun) / 매게변수(파라미터)("()")
public void getRun() <----메소드 선언부

sout("i=", +i); <-------메소드 정의부
sout("a=", +a);
sout("b=", +b);

<메소드 호출>
ex)
Phone phone = new Phone();

phone.getRun();<-- 호출

<매개변수=메서드를 호출할때 데이터를 전달 할 수 있다.>
지역변수, 전역변수

<중복메소드(overloading) 이름은 같고 매개변수의 개수 또는 타입이 다른 메소드를 만들 수 있다.>

<접근자 =머소드를 호출 할 때 접근자에 따라서 호출이 불가할 수 있다.>
private 메소드: 외부에서 호출x
public 메소드:외부에서 호출O

[객체와 메모리]

< 같아도 다른 공간에 존재하는 다른 객체>
객체 생성 -> 클래스가 같아도 객체를 다 다르게 생성하기 때문같지 않다

<null과 NulPointException>
레퍼런스에 null이 저장되면 객체의 연결이 끊기며, 더이상 객체를 이용할 수 없다.
obj1= null; //레퍼런스 끊김
sout("obj1---->" + obj1);
obj1.getRun();

결과
obj1---->null

+끊겼는데 다시 접근을 하게 되면 NullPoint Exception이 발생한다.
가리키는게 없다는 의미이다.

[생성자, 소멸자, this 키워드]

<디폴트 생성자 : public ObjectClass(){...}>
객체가 생성될때 가장 먼저 호출되는 생성자로, 만약 개발자가 명시하지 않아도 컴파일 시점에 자동 생성


<사용자 정의 생성자(파라미터에 배열 문자열 모두 가능)>
디폴트 생성자 외에 특정 목적에 의해서 개발자가 만든 생성자로, 매게변수에 차이가 있다.

<소멸자 메소드>
객체가 GC에 의해서 메모리에서 제거 될때 finalize()메소드가 호출 된다.


<GC란?>
쓰레기 수집(garbage collection 가비지 컬렉션)

메모리 관리 기법 중의 하나로,
프로그램이 동적으로 할당했던 메모리 영역 중에서 필요없게 된 영역을 해제하는 기능


protected void finalize() throws Throwable{
sout()
super.finalize();
}

system.gc(); ->컴퓨터에게 GC를 실행하라는 명령 /GC가 바로 작동하지 않는다, 가급적 빨리 작동하도록 요청하는 것
+java는 기본적으로 메모리를 개발자가 직접 관리하지 않으므로 일반적으로 system.gc(); 를 사용하는 경우는 드물다

<this : 현재 객체를 가리킬때 사용>
해당 클래스의 객체를 가리킨다.

public class Object {
public int x; <--전역변수
public int y;

public ObjectClass(intx, int y){ <----x,y지역변수
this.x=x; <--Object의 전역변수인 x를 나타낸다.
this.y = y; <--Object의 전역변수인 x를 나타낸다.
}
}

[패키지와 static]

<패키지 : java는 많은 클래스로 구성되고, 이러한 클래스를 폴더 형식으로 관리하는 것을 패키지라고 한다>
사용하고픈 클래스가 다른 파일에 있으면 import를 하여 사용하여야 한다.

*만약 다른 패키지 안에 있는 클래스를 전부 사용하고 싶으면 *사용

import com.파일이름.파일이름.*;
*import를 하지 않으려면 풀로 다 적어주면 됨(하지만 잘 사용되지 않음/보기 좋지 않음)
ex)com.java.daily.Google google = new com.java.daily.Google();

[패키지 이름 결정 요령]
-이름은 패키지에 속해 있는 클래스가 최대한 다른 클래스와 중복되는 것을 방지하도록 만든다.
-패키지 이름은 일반적으로 도메인을 거꾸로 이용한다.
-개발중에 패키지의 이름과 구조는 변경될 수 있다
-패키지 이름만 보고 해당 패키지 안에 있는 클래스가 어떤 속성과 기능을 가지고 있는지 예상할 수 있도록 만들어야 함

<static>
클래스의 속성과 메소드에 static키워드를 사용하면 어디서나 속성과 메소드를 사용할 수 있다.
ex)static int amount = 0
단, 공유를 해서 사용하기 때문에 이전 값이 저장이 된다.

[데이터 은닉 : 외부로부터 값이 변질되지 않게 보호하는 방법]

<멤버변수 private 설정>

멤버변수(속성)는 주로 private으로 설정해서 , 외부로부터 변질되지 않게 보호한다.

<Setter,Getter로 데이터에 접근하여 사용>

private String name;

private int score;

public String getName(){

return name;

}

public int setName(){

this.name = name;

}

public int getScore(){

return score;

}

public int setScore(){

this.score = score;

}

Q. 왜 public으로 접근을 할건데 굳이 왜 private을 사용하여 귀찮게 접근을 하는가?
A.

만약에 score를 변경하는 규정이 있다면?

50보다 크변 변경해라

ex)

public int setScore(){

      if(score >50) this.score = score;

      }

}

안정장치같은 느낌으로 사용한다.