<Java> 기초 문법 공부 2
[객체 지향 프로그래밍(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;
}
}
안정장치같은 느낌으로 사용한다.