단축키) 

[syso] 치고 + [ctrl + space] : 출력문 자동완성

[Ctrl+Alt+아래 화살표 ] : 한줄복사.



1. 클래스(Class)의 구조

  패키지 선언 >

 import구문(java.lang.* 패키지 안에 것들은 생략되어있음) >

 접근제한자 (public ~) > 클래스 선언 > extends Object(생략, 자바계층구조도의 최상위는 Object) > 인터페이스 implement >

 필드or멤버변수 > 

 생성자 > 

 매쏘드


2. 생성자(Constructor)

 - 생성자 : 객체 생성시 호출이 된다.(new 생성자( 생성자의 파라미터)).  메소드와 형식이 비슷하지만, [이름이 클래스명과 같고 ] [리턴타입이 없다]

       생성자를 통해서, 클래스안의 필드들에 기본값을 넣어준다.

 - 기본생성자(default constructor) : 클래스의 접근제한자와 이름이 같은 것을 가지고, 인자값(파라미터, 매개변수)가 아무것도 없는 생성자.

   만약 생성자가 하나도 없으면, 컴파일러가 자동으로 기본생성자를 만들어준다.


//생성자 생성 [Ctrl + Space]로 default 생성자를 바로 생성할 수 있다.

//default 생성자. 클래스와 똑같은 public이라는 접근제한자를 가진다.

public Car() {

}

//직접 생성자 생성. 접근제한자는 클래스의 접근제한자와 동일하게 해주는 것이 좋다. 파라미터를 추가했다. 

public Car(String owner) {

this.owner = owner; //받은 파라미터를 클래스의 멤버변수(필드)에 대입하려면 this.멤버변수(필드) 에 대입한다.

//다른 방식으로서, 인자를 2개를 가지고 있지 않더라도,인자 1개의 생성자라도 임의의 값을 넣어서 인자 2개인 생성자를 호출할 수 있다.

//this("임의의색으로 다른 생성자 호출", owner);

}

//생성자 오버로딩을 이용해서, 파라미터를 더 추가했다. 

public Car(String color, String owner) {

this.color = color;

this.owner = owner;

}




3. 오버로딩(Overloading)

 - 메소드 혹은 생성자와 같은 이름을 가지나, 인자(파라미터, 매개변수)의 형태나 갯수, 순서가 달라서, 완전히 다른 것으로 인식 되는 것.

 - 개발의 편의성을 위해 존재한다.


//생성자 오버로딩을 이용해서, 파라미터를 더 추가했다. 

public Car(String color, String owner) {

this.color = color;

this.owner = owner;

}



4. this(예약어) - 파라미터로 넘어온 것을, 클래스의 것인 필드(멤버변수)에 대입할 수 있다.

 -  현재 객체의 참조형으로, 예를 들어


 public class Point {


private int x, y; //필드(멤버변수) 2개.


//4개의 생성자가 오버로딩 되어있다.


public Point(int x, int y){ // 1. 파라미터로 넘어온 x를 --> 클래스안의 필드(멤버변수)에다가 집어넣고 싶을 땐, this.x 에 집어 넣는다. 

        클래스안에서 기본값을 넣어준다.

this.x = x; // 즉, 클래스의 x를 this.x <--> 파라미터로 넘어온 것은 그냥 x

this.y = y;

}


public Point(){ // 2. 클래스명과 동일한 접근제한자+이름 을 가진다. 인자(파라미터)에는 아무것도 없으니, 기본 생성자다.

this(0, 0);  // 이때, 이 2번 기본생성자의 this(0,0)는 --> 파라미터가 2개인 1번 생성자 class Point(int x, int y)를 호출해서 x와 y에다가 0,0을 넣어주게 된다.

}


public Point(int x){

this(x,0);

}

public Point(int y){

this(0,y);

}



}


5. 접근 제한자(Access Modifier)

 - 클래스, 멤버변수, 메소드, 인터페이스 등에 붙어서 접근가능여부(사용여부)를 알려주는 예약어 이다.

 - public > protected > default > private 순으로 범위가 좁아진다

(1) private : 클래스 안에서 선언되면, [같은 클래스 안]에서만 쓰인다. 

(2) default : 접근제한자가 없는 것으로, 클래스의 안에서 선언되도, [패키지 안]의 어느 클래스에서나 사용가능하다.

(3) protected : default보다는 넓은 범위로, 한 패키지내에서 다른 클래스가 다 사용가능하고 + [ 다른패키지라도 자식클래스(subclass) ]라면 사용가능한 것이다.

(4) public : [ 제한 없는 것], 다른 컴퓨터에서도 네트워크로도 접근가능하다. 네트워크프로그래밍에서는 필수


 *** 마땅한 이유가 없으면 필드(멤버변수)는 반드시 private로 선언하는 것이 좋다.

 *** 상수(final)이 아닌 경우에는 public을 쓰지 않는 것이 좋다.




6. 소유제한자(Static)

 - 클래스내부의 메소드나 변수 앞에 붙어서 [누구의 것인지]를 나타낸다.

 ex> String s; --> 생성된 각 [객체]의 것, ===> 메인함수에서, 객체.변수명으로 사용

static String s; --> [클래스]의 것     ===> 메인함수에서, 클래스명.변수명으로 사용 && 어느 객체의 객체.변수명으로도 접근이 가능하나, 클래스에 저장된다.

 - static이 붙어 있으면 클래스의 것으로, 객체.를 이용해서 사용하는 것이 아니라, 클래스.을 이용해서 사용하는 것이 좋다.

***여러개의 어느 객체에서든 객체.변수명에 새로운 값을 대입하면, 클래스의 것인 static 변수가 바뀐다. 그러나 정식으로 접근하는 것은 아니다.***

 - static final의 형태로, 상수값 선언할 때 사용한다. (클래스의 단 하나의 것이면서, 안움직이게!)


public class Car{

Stirng color; // static 없으니 객체의 것(객체를 선언해서 거기서 사용) --> Car1.color, Car2.color

static String modelName; // static 있으니 클래스의 것(클래스 내부에서만 저장) --> Car.modelName / Car1.modelName도 가능하긴함

static int maxSpeed = 300;

}


..

public class Car {

public static int height;//static을 붙혔으니, 메인함수에서, 객체없이 [Car.변수명]으로 바로 쓸 수 있다.

}


public static void main(String[] args) {

Car.height = 100; // Car의 객체 car 생성 없이도, 바로 쓸 수 있는, 클래스의 것인 static 변수


...

//객체에서 height 값을 주지 않았으나, 클래스의 것인 static변수 height는 , 어느 객체에서든 --> 클래스의 static 변수로 접근이 가능하며, 클래스내부 1개의 값만 호출한다. 그러나 객체를 통한 접근은 정식접근이 아니다.

System.out.println(c1.height);

//c1에서 클래스의 것인 static변수  height에 값을 대입하면, c2에서 접근하더라도 클래스의 것인 height는 입력한 값이 출력된다.

c1.height=200;

System.out.println(c2.height);

System.out.println(Car.height);


}


---출력값--------------------

100

200

200

------------------------------


7. 객체 생성과 사용

 - new 라는 예약어생성자를 호출하여( new Object()) ---> ReferenceType변수(참조형 변수, 클래스명)에 대입을 하는 것이다.  

   Object o = new Object();

 - 한 클래스 안에 , 다른 클래스의 객체를 , 필드로 가지고 있는 경우 : has a 관계


public class Wheel{

int radius;  // 반지름을 필드로 가지는 Wheel클래스

}


public class Car{

Wheel wheel; // Wheel클래스의 객체를, 필드로 가지는 Car클래스

String meodel;

}


 - 이때, Car는 Wheel을 가지고 있는 has a 관계이다.

 - 이것을 메인함수에서 사용해보면,


Car c = new Car();

Wheel w = new Wheel(); //w에 객체를 생성함

c.wheel = w; // 생성된 객체를 같은 타입의 c.wheel에다가 대입해주니, c.wheel에는 Wheel객체인 w가 참조됨

c.wheel.radius = 100;


 > 객체지향의 특징으로, c는 Car의 객체로서, wheel이라는 Wheel의 참조형변수를 가지고 있다(아직 객체 생성은 안됬다). 거기다가 new생성자를 호출해서 객체를 생성한 w를 대입해주면, c.wheel에는 w객체를 참조하게된다.  c.wheel이라는 객체는 Wheel의 객체와 같으므로, radius라는 필드를 가지니, 거기다 100을 대입했다.

 >  이때, c.wheel.radius =100;과   w.radius=100;은 똑같다.  w 자체가 c.wheel에 담겨 있으므로, w에 대입해주나 c.wheel에 대입해주나 같이 c. 안에 들어가게 된다.    ( 객체지향으로, w는 c.wheel담겨져 참조된다.  w에 대입해도 c.wheel 안에 들어가게 된다 )


8. JVM메모리의 구조

 - Method area / Stack Area / Heap Area로 구분된다.

(1) Method Area : class에 관련된 정보들이 저장된다. (static 등..)

(2) Stack Area : 매쏘드가 실행이되는 부분(main())에서 사용되는 변수들이 저장된다.

(3) Heap Area : 각 객체가 new Car(); 으로 만들어 질 때, 각 객체들의 정보가 저장된다. 

Stack Area에서 Car a = new Car();로 변수에 참조를 할 때, 여기의 객체정보들이 쌓여서 참조된다.


객체HeapArea에서 hashCode를 가지고, StackArea의 각 변수들이 이 hashCode들을 참조하고 있다.


//객체를 출력해보면, 속한 패키지. 클래스명 @ 해쉬코드가 찍힌다.

System.out.println(c1);

System.out.println(c2);


//c2를 c1에 대입하면, heap area의 c2에 연결되던 new Car() 객체 정보가 -> Stack Area의 변수 c1과 연결되서 , 기존 c2와의 연결은 끊어진다.

c1 = c2;

System.out.println(c2);

----

classa.Car@7852e922

classa.Car@4e25154f

classa.Car@4e25154f

---------------------


9. 실습


public class Car {

private String owner;

String name; //접근제한자 default

protected String color;

public static int height;//static을 붙혔으니, 메인함수에서, 객체없이 [Car.변수명]으로 바로 쓸 수 있다.

//생성자 생성 [Ctrl + Space]로 default 생성자를 바로 생성할 수 있다.

//default 생성자. 클래스와 똑같은 public이라는 접근제한자를 가진다.

public Car() {

}

//직접 생성자 생성. 접근제한자는 클래스의 접근제한자와 동일하게 해주는 것이 좋다.

public Car(String owner) {

this.owner = owner; //클래스의 멤버변수(필드)에 대입하려면 this.멤버변수(필드) 에 대입한다.

//다른 방식으로서, 인자를 2개를 가지고 있지 않더라도,인자 1개의 생성자라도 임의의 값을 넣어서 인자 2개인 생성자를 호출할 수 있다.

//this("임의의색으로 다른 생성자 호출", owner);

}

//생성자 오버로딩을 이용해서, 파라미터를 더 추가했다. 

public Car(String color, String owner) {

this.color = color;

this.owner = owner;

}



public static void main(String[] args) {

Car.height = 100; // Car의 객체 car 생성 없이도, 바로 쓸 수 있는, 클래스의 것인 static 변수

Car c1 = new Car();

c1.name = "조재성 카";

//생성자를 이용한 객체 생성. ()안에 ctrl+space로 고를 수 있다.

Car c2 = new Car("조재성");

c2.name = "조재성 카2";

//syso + Ctrl+space를 하면 자동완성된다.!

//객체어서 height 값을 주지 않았으나, 클래스의 것인 static height는 , 어느 객체에서든 --> 클래스의 static 변수로 접근이 가능하다.

System.out.println(c1.height);

//c1에서 클래스의 것인 static변수  height에 값을 대입하면, c2에서 접근하더라도 클래스의 것인 height는 입력한 값이 출력된다.

c1.height=200;

System.out.println(c2.height);

System.out.println(Car.height);

//클래스의 것은, 객체 어디서든 접근가능하나

//객체의 것인, 필드들은, 각각 다르다.

System.out.println(c1.name);

System.out.println(c2.name);

System.out.println(c1.owner);

System.out.println(c2.owner); //c2는 생성자를 통해 각 객체의 것인 필드값에, 소유자를 적어서 생성했으니, null이 안뜬다.


//객체를 출력해보면, 속한 패키지. 클래스명 @ 해쉬코드가 찍힌다.

System.out.println(c1);

System.out.println(c2);


//c2를 c1에 대입하면, heap area의 c2에 연결되던 Car 객체 정보가 -> Stack Area의 변수 c1과 연결되서 , 기존 c2와의 연결은 끊어진다.

c1 = c2;

System.out.println(c2);

}


}

+ Recent posts