basicJAVA/5. Oop

201021 OOP_01, TvTest

unemo 2020. 10. 21. 21:42
반응형

 

 

 

 

 

OOP : Object Oriented Programming (객체 지향 프로그래밍)
 

 1. 객체지향 언어


  - 기존의 프로그래밍 언어에 몇 가지 새로운 규칙을 추가한 보다 발전된 형태이다.
  - 규칙이 있기 때문에 좀 더 편하게 이용할 수 있음
  - 규칙들을 이용해서 코드간에 서로 관계를 맺어줌으로서 보다 유기적으로 프로그램을 구성할 수 있다.(3.5~나오는내용)
  - 뭔가 특징이 잇으니까 사용하는것.. 

 

객체지향언어의 특징 재 / 관 / 신
  - 코드의 사용성이 높다. 한번만 만들어놓고 계속 갖다쓰니까
  - 코드의 리가 용이하다. 물끓이는데 문제가있으면 물끓이는거 하나만 고치면 되니까
  - 뢰성이 높은 프로그래밍이 가능하다. 

    절차지향에서 물끓이는거 1000개를 멸치육수로 바꾸고싶으면 1000개 바꿔야함
     객체지향은 물끓() 하나만 바꾸면 된다 >> 신뢰성이 높다
 
 2. 클래스와 객체
  - 클래스란?
   : 레시피같은거.. 레시피 통해서 된장찌개(인스턴스 (객체))
   즉 클래스란 객체를 정의해 놓은것.
   즉 객체의 설계도
   
   ex  클래스          객체
  ----------------------------
  제품설계도          제품
  tv설계도                tv
  붕어빵기계         붕어빵
  (실제 정확한 의미와는 조금 다를 수 있음)
 
  - 클래스 선언
  : [접근제어자][지정예약어] class 클래스명 [extends 클래스명] [implements 인터페이스명]{}   <<요게 한세트 []안에있는건 3.5부터 나오는내용
  public abstrace class Parent extends Child implements Serializble{}  <<예제
 
  - 객체란?
    : 실제로 존재하는 것. 사물 또는 개념등을 의미한다 (모자, 컴터, 책상 다 포함 )

(모니터를 객체로 만들었으면 모니터설꼐도가 클래스 모니터안의 부품들(속성) 조립방식(메소드))
    tv를 예로들면
    객체의 구성요소 (1.멤버변수 (속성) 2. 메소드)
    1. 속성 (멤버변수, 특성, 필드, 상태)
     => 크기, 길이, 높이, 색상, 볼륨...
    2. 기능(메소드, 행위, 함수, function..)
     => 채널올리기, 볼륨 내리기, 켜기, 끄기 (전원이라고 하면 속성임. 기능은 행동!!)
    
 
 3. 인스턴스란?
  - 클래스로부터 객체를 만드는 방법을 인스턴스화라고 한다.
  - tv클래스로부터 만들어진 객체를 tv클래스의 인스턴스라고 한다.
  - 인스턴스를 생성하는 방법
   클래스명 변수명; //여기까지가 클래스의 객체를 참조하기 위한 참조변수 선언
   변수명 = new 클래스명(); //클래스의 객체를 생성 후 객체의 주소를 참조변수에 저장
  
  
 4. 변수 선언 위치에 따른 변수의 종류
  - 전역변수(멤버변수로 불리기도 하고 클래스변수랑 인스턴스 변수로 나뉨 )
  - 지역변수
   매소드 내에 선언되며 매서드 내에서만 사용할 수 있다. 메서드와 생명주기를 함께하는 녀석
   메소드 종료 시 소멸된다
   for문 또는 while문의 블럭 내에 선언된 지역변수는 해당 지역에서만 사용가능하다
  
  - 인스턴스변수
   클래스영역에 선언되며 클래스의 인스턴스가 생성될때 함께 생성된다. 

   즉 인스턴스와 생명주기를 같이한다.
   인스턴스 변수의 값을 읽어오거나 저장하기 위해서는 인스턴스를 먼저 생성해야한다
   ***인스턴스는 >>>독립적인 저장공간<<<을 가지므로 서로 다른 값을 가질 수 있다.
   ***그러므로 인스턴스마다 고유한 상태를 유지해야 하는 경우 인스턴스 변수로 만든다.
  
  - 클래스변수
   static이 붙어있음. 모든 인스턴스가 공통된 저장공간을 가진다.
   한 클래스의 모든 인스턴스들이 공통적인 값을 유지해야 하는 경우 클래스변수로 선언한다.
   인스턴스 변수앞에 static만 붙여주면 된다.

 

 

이제

직접 만들어보자

 

public class TvTest {
	public static void main(String[] args) {
    }
}
    class Tv{

이걸 저장하면 컴파일이 되고, 확장자는 .java가 생긴다. class가 두개이므로 클래스파일이 2개생기고,

D:\A_TeachingMaterial\1.BasicJava\workspace\basic_java\bin\e_oop  bin파일 아래에 생긴다.

 

TvTest에서는 Tv클래스의 존재를 모르고, 어딘가에 있는 레시피일 뿐, TvTest에서 Tv를 불러야만 알 수 있다.

 

 

Method Area(클래스를 저장하는역할)에 Tv 클래스가 저장된거고 친구들(클래스변수, 클래스매소드)가 같이 올란간다.

 

static String color; //색상
	boolean power;
	int channel; //이거 세개 다 전역변수 다른말로 멤버변수

얘네 전부가 전역변수 (멤버변수)이다.

static이 붙은건 클래스변수

안붙은건 인스턴스 변수

 

행위도 만들어보자

static void changeColor(){//chan이거 호출되면 같은영역 메소드아레아의 color찾아서 레드로바궈줌
		color = "red"; //전역변수는 이래서 좋음. 
        //메소드안에서 선언된적없지만 다른메소드들에서 다 쓸수있음
		//
	}
	
	void power(){
		power= !power;////power 부정해서 true가됨 
        // 일다했으니 퇴근해야 메인메소드가 시작됨 콜스택에쌓인ㅇ거지우기 다시올라가
	}
	
	void channelUp(){
		channel++;
	}

static이 붙은 changeColor메소드는 클래스메소드.

power()와 channel()은 인스턴스 메서드

 

설계도 (클래스) 다 만들었으니 이제 tvTest로 올라가서 Tv를 불러주자

 

참고로 만든 클래스 위에는 /**을 눌러서 주석으로 메모를 해준다.

/**
 * Tv의 설계도
 * @author PC-14
 * @since 2020.10.21
 */
class Tv{

 

public class TvTest {
	public static void main(String[] args) {
	
		//Tv.color;

1. Method Area에 TvTest 클래스가 먼저 올라감

클래스변수가 없고, 메소드는 main 메소드 (static 붙어있음) 뿐 (main메소드값이 로드됨)

이제 CallStackmain메소드가 호출되고,

 

Tv.color 에서 .은 ~아래에있는걸 불러낼때 사용.

점을 치면 이렇게 여러개가 나오는데,

빈삼각형은 변수, 채운삼각형은 메소드, s는 static을 말한다.

Tv. 했을때 나오는 color와 color()는 클래스 변수와 클래스 매서드이다.

 

클래스명. 하고 부를 수 잇는 건 클래스의 친구만 부를 수 있다. 인스턴스친구는 못부른다.

초기화를 안해주고 선언만 했으니 기본값으로 출력된다.

 

System.out.println(Tv.color);//null

Tv.color = "black";//값을 블랙으로 넣어주자
System.out.println(Tv.color);
		
Tv.changeColor();//컬러를 레드로 바꾸고 싶은데 
       			//일일히 안바꾸고 레드로 바꾸는 일을하는놈을 불러주고싶음 메소드를 부르자.
System.out.println(Tv.color);

이런식으로 변수에 직접적으로 접근해서 내가 바꿔줄 수도 있고, 메소드 불러서 일시켜도 됨.

즉 메소드가 많을 수록 내가 직접 코딩할게 적어진다.

 

2. 괄호안에 있는게 없으면 출력구문 자체가 안되니까 출력구문은 괄호 안에가 우선

괄호 안에 Tv클래스라는 클래스가 먼저 호출 (Method Area에 Tv클래스가 올라감)친구들 클래스변수 color (null) 클래스매서드 changeColor() 까지 메모리에 올라감.

실제로는 System클래스 안의 println이라는 클래스메소드를 호출 (메모리에 굳이올리지않고 콘솔만 만든다)

Tv에 있는 color가 가진 값 null 을 출력합니다.

 

3. 대입연산자 ㅇ=ㅇ 에는

1. 왼쪽에 저장공간을 확보를 한후, 2. 오른쪽 연산을 한 후에 3. 오른쪽값을 왼쪽에 대입을 한다. 즉 왼쪽 먼저다.

Method Area에 Tv클래스를 올리러 갔으나, 이미있다. 변수는 갈아치우는데 얘는 먼저확보한 놈이 우선이라 이미있으면 올리지 않는다. 그럼 Tv안에있는 color값을 오른쪽값 "black"으로 바꿔준다.

 

 

4. Tv 클래스가 호출돼서 Method Area에 올리러 갔더니 이미 있으니까 Tv.아래에 있는 changeColor()호출

메소드 호출됐으니 CallStack으로 그니까 main()메소드가 진행하다가 멈추고 위에쌓인 changeColor()를 하게됨

 

5. changeColor() 가면

메서드안에 color = "red"; 가 있음 대입연산자 있으니까 왼쪽부터 color 근데 어디있는 컬러??? 같은 영역에 있는 그 안에 (박스) 그 컬러를 오른쪽 red로 바꿈

 

6. 중괄호가 닫힘 > 내 일 main이 다시 시작됨 main으로 돌아감

 

 

~이제 인스턴스화~

 

 

 

 

~클래스를 인스턴스화해야 인스턴스가 생기고 인스턴스 친구들 공부할수있으니까 인스턴스화 하겠음~

Tv t = new Tv();

new Tv( ); 하는게 인스턴스화!

원래 인터넷에 있던걸 내 컴에 저장하는 것

new 하면 Heap영역에 주소 만들어지고, 주소를 저장할 공간이 참조변수 t

 

정수를 저장하려면 int 타입을 불렀듯이, 참조형은 만든 인스턴스의 주인인 Tv클래스가 타입이 된다.

이런 인스턴스는 무한대로 만들 수 잇다. 인스턴스화 해서 t에 저장한 것이고, t는 참조형이니까 주소값이 있음

그 주소를 찾아가면 인스턴스멤버 (인스턴스변수와 인스턴스 메소드)가 있는거임

 

즉 인스턴스 멤버들을 호출하려면 t를 거쳐야 한단말

t는 참조형변수를 줄여서 참조변수 라고 한다.

 

인스턴스 멤버를 호출하는 방식!

1. 인스턴스화를 통해 주소를 만들고 (new로 네모칸) 

2. 이를 참조변수 t에 담는다.

 

대입연산자 =가 있으니까 왼쪽부터 시작.. Tv 클래스는 는 Method Area에 이미있다. 그 다음 t는 어디서 선언됐음? t는 참조변수긴 한데 어디서 선언됨? 메인메서드 안에서 선언된 t가 선언됨! 지역변수
메인메소드 안에서 선언된 메인메소드 안의 변수이므로 콜스택에있는 main()에 t가 쌓이는것
이제 우변에 new tv는 인스턴스화로, 인스턴스가 만들어짐Heap영역 t의 주소(인스턴스)가 생김.
이때 인스턴스변수와 인스턴스 메소드가 Heap영역에 같이 올라가고
변수는 초기화가 되어있지 않으니까 초기화하면서 넘어감 (power는 false , channel은 0
그담엔 channelUp() , powerUp()  인스턴스완료
맨마지막 = 은 오른쪽에 완성된 t의 주소(우변)을 t에게 주는거임 
t.channel = 10;///////t의 주소에 있는 채널을 0>10으로 바꿈
		System.out.println(t.channel);

t주소에 가서 채널이 가지고 있는 값을 출력한다 > 10출력

뭐든 부를때는 누구의 친구인지를 알아야 함

대입연산자 보이고, t.이니까 t의 주소에 있는 채널을 10으로 바꾼다.

t주소에 있는 채널값을 출력

 

//근데 채널 하나 올릴래
		t.channelUp();
		System.out.println(t.channel);
		//채널이 1 올라갔다.

 

t.power(); 
System.out.println(t.power);

t의 주소에있는 power() 메소드를 호출 (메소드 호출은 Call Stack에서 한다)

즉 Call Stack에 power()가 쌓이고, 이제 power()에 가서 그 영역에있는 power가 boolean power (false가기본)이니까 부정하면 true 출력 

 

퇴근! 콜스택에 있는거 지우고 다시 메인으로 가기

t주소에 있는 power값 출력

main 메서드 닫힘 퇴근 콜스택지움해당클래스 닫히니까 매서드에리어에 있는거 지워짐

 

정리

다른 클래스에 잇는 멤버를 호출하고 싶을 때는

1. 누구의 친구인지 확인

2. 클래스 친구면 클래스, 인스턴스 친구면 인스턴스화 하고, 참조변수에 저장해 놓은 후에 참조변수명. 해서 부르면됨

 

ex) Math 클래스의 random()은 클래스이름. 이니까 random()은 클래스메서드

Scanner클래스는 Scanner sc = new Scanner(System.in) 으로 인스턴스화 해 준다음에 sc.nextInt(); 이렇게 쓰니까

인스턴스 메서드

 

변수, 메서닥 어떤것들이 필요한지를 알고 만들 수 있어야 함.

 

} 

암튼 true까지 출력 후 CallStack에서 메인메소드를 지운다.

그다음에 클래스가 끝나니까 Method Area에 잇는것도 다 지워진다.

근데 Heap은 지워지지 않는다.

 

이때 Gabege Collector 가 활동하여 나머지 메모리를  깨끗하게 지워준다.

 

 

 

반응형

'basicJAVA > 5. Oop' 카테고리의 다른 글

201023 매서드의 종류, 클래스멤버와 인스턴스 멤버간 참조호출  (0) 2020.10.23
InterVari  (0) 2020.10.23
201022 MyMathTest  (0) 2020.10.22
201022 METHOD  (0) 2020.10.22
20201022 CardTest  (0) 2020.10.22