7. 18

바르고·2023년 7월 18일
0

JAVA 객체지향.

OOP is APIE

객체지향 프로그래밍, Object Oriented Programming

객체란.
 - 주체가 아닌 것.
 - 우리 주변에 있는 모든 것으로 프로그래밍의 대상 : 사물, 개념, 논리
 
객체지향 프로그래밍
 - 주변의 많은 것들을 객체화 해서 프로그래밍 하는 것

꽃집 예시.
 - 중간에 꽃 종류가 바뀌더라도 시스템이 바뀌지 않는다.
 - 거베라, 유칼립투스.
 
 객체지향 프로그래밍 장점
  - 블록 형태의 모듈화 된 프로그래밍
    - 신뢰성 높은 프로그래밍이 가능하다
    - 추가/수정/삭제가 용이하다.
    - 재 사용성이 높다.
  - 객체지향 or Not
    - 레고 비행기 vs 진짜 비행기
    - 객체지향은 레고 쪽이..

현실 객체, 클래스, 프로그램 객체
  - 현실의 객체가 갖는 속성과 기능은 추상화, abstraction 되어 클래스에 정의!
  - 클래스는 구체화 되어 프로그램의 객체 instance, object 가 된다.
  
붕어빵
 -, 설계도, blueprint 사용
 - 설계도는 제품을 만드는데 꼭 필요하지만 틀을 먹진 않잖아?
 - 설계도는 하나의 종류, Type 이 되고 설계도를 통해 나온 제품을 객체라고 부르며 주체가 사용
 

추상화와 구체화
 - 현실세계
   - 사람
   - 이름, 나이, 배고픔
   - 먹는다, 일한다
   
 추상화 =>
   
 - 프로그래밍
   - Person
   - name, age, isHungry
   - eat(), work()
   
 구체화, 객체화 =>
 
 - 객체, instance
   - Person = new Person;
   - ...
   - ...
   - 메모리, 힙 메모리에 살아감.
 
 
클래스
 - 객체를 정의해 놓은 것, 설계도,- 직접 사용은 불가

객체, instance, object
 - 클래스를 데이터 타입으로 메모리에 생성되어 실제로 동작하는 것
 
 #####

public class Person {
	String name;
	int age;
	boolean inHungry;
	
	void eat() {
		System.out.println(냠냠);
		isHungry = false;
	}
	
	void work() {
		System.out.println(아자);
		isHungry = true;
	}
	
}

public class Persontest {
	int a= 0;
	
	Person p1 = new Person();
	p1.name = "박차운";
	p1.age = 10;
	p1.isHungry;
	
	p1.eat();
	p1.work();
	
	Person p2 = new Person();
	p1.name = "서즈노";
	
	System.out.println(p1.name + " "+ p1.age);
	}

#####

JVM의 메모리 구조
 - metaspace, stack, heap
 
 - metaspace
   - 클래스 정보 처리
     - 타입 정보
     - Field 정보
     - Method 정보
 
 - stack
   - 메서드들의 실행 공간
     - thread 별로 별도 관리
     - 메서드 호출 시 마다 메서드 프레임 적충
     - 메서드 프레임에 로컬변수도 쌓이는 구조
 
 - heap
   - 객체를 저장하기 위한 영역
     - thread에 의해 공유
     - 객체가 생성되고 G.C에 의해 정리됨.
     - 상수 풀ㅋ
     
     ![](https://velog.velcdn.com/images/bargoloft/post/aaf2746a-83e3-4955-98fa-2746dce8952d/image.png)

객체를 만들면 멤버 변수들은 default 초기화가 이루어짐.


변수

타입에 따른 분류
Primitive
Reference

선언위치에 따른 분류
 - 멤버 변수
   - 클래스 멤버 변수
     - 클래스 영역, static
   - (인스턴스) 멤버 변수
     - 클래스 영역
 
 - 지역 변수
   - 지역 변수
     - 함수 내부
   - 파라미터 변수
     - 함수 선언부

인스턴스 멤버 변수
  - 선언 위치 : 클래스 {} 사이에 선언
  - 생성 : 객체 만들어질 때 HEAP에 객체 별로 생성
  - 타입 별로 default 초기화
  - 객체 생성 후(메모리에 올린 후) 객체 이름(소속)으로 접근
    - 개체를 만들 때마다 객체 별로 생성 => 객체마다 고유한 상태 유지
      => stateful
  - 소멸시점
    - G.C에 의해 객체가 없어질 때 (프로그래머가 명시적 소멸 불가)

static, 정적
  - 거의 안 바뀌는데.. 바뀔수도..?

클래스 멤버 변수
  - 선언 위치 : 클래스 {} 사이에 선언 되며, static 키워드 붙임
  - 생성 : 클래스 로더에 의해 클래스가 로딩 될 때 heap에 클래스 별로 생성
  - 개별 객체의 생성과 무관하며 모든 객체가 공유하게 됨(공유변수)
  - 초기화 : 타입 별로 default 초기화
  - 접근 : 객체 생성(이름)과 무관하게 클래스 이름으로 접근
    - 객체로 접근해도 동작은 되지만 추천하지 않음.
  - 클래스가 언로드 될 때 G.C 발생
  
지역 변수, 파라미터 변수
  - 선언 위치 : 클래스 영역의 {} 이외의 모든 중괄호 안에 선언되는 변수들
  - 생성 : 선언된 라인이 실행될 때
    - 생성 메모리 영역 : stack의 메서드 프레임 내부
  - 초기화 : 사용하기 전 초기화 필요
  - 접근 : 외부 접근 불가하므로 소속 불필요
    - 내부에서는 이름에 바로 접근
  - 소멸 : 선언된 영역인 {}을 벗어날 때
  


메서드

메서드란?
  - 현실의 객체가 하는 동작을 프로그래밍 화
  - 어떤 작업을 수행하는 명령문의 집함
  
메서드를 작성하는 이유
  - 반복적으로 사용되는 코드의 중복방지
  - ...
  
메서드의 작성 방법
 - 선언부
   - 제한자 리턴_타입 메서드이름(파라미터들, ...)
   - 리턴타입
     - 반환하는 타입으로 없을 시 void
     - 결과 받을 때 묵시적 형 변환 적용
     - 리턴 타입은 하나만 적용 가능
   - 메서드 이름은 의미 있는 이름으로
   - 파라미터 목록
     - 넘길 거 없으면 생략 가능
     - 파라미터 전달 시 묵시적 형변환 적용

Variable arguments
  - 메서드 선언 시 동일타입의 몇 개의 인자가 올 지 예상 못 할때
    - 배열 타입 선언 가능하나 => 메서드 호출 전 생성 초기화 번거로움
    - ...을 이용해 파라미터를 선언하면 호출 시 넘겨준 값의 개수에 따라 자동으로 배열 생성 및 초기화
    - variableArgs( int... params)
    - ex) printf(String format, Object... argument)

 - 구현부
   - 비즈니스 로직 작성
   - 마지막에는 선언된 리턴 타입에 해당하는 값을 return
     - 값 반환 시에 묵시적 형변환 적용
     - voidreturn 생략가능
     - 메서드 수행 중 return 만나면 종료.
       - 조건문 이용 시 모든 조건에서 return 필요.

메서드 호출
  - 호출 시 반드시 선언부에 맞춰 호출
    - 메서드 이름 : 반 드 시 동일
    - 파라미터 : 선언된 파라미터 개수는 반드시 동일, 타입은 promotion 적용 가능
  - static, non static 구분해서 호출

class 멤버와 instace 멤버간의 참조와 호출
 - 가장 중요한 건 호출하려는 멤버가 메모리에 있나?
   - 있으면 가능
   - 없으면 불가, 먼저 메모리에 로딩 후 사용
   
 - static member => 언제나 메모리에 있음
   - 클래스 로딩 시 자동 등록
 - instance member => 객체 생성 전에는 메모리에 없음
   - 객체 생성 시 모든 일반 멤버들은 메모리에 생성
   - 객체 즉 레퍼런스를 통해서 접근
 
 
스택, stack
  - First in Last out
  - 각각의 메서드 호출 시 마다 동작을 위한 메모리 상자를 하나씩 할당

기본형 변수와 참조형 변수
 - 메서드 호출 시 파라미터로 입력된 값을 복사! 해서 전달
 - call by value
 - 주소값을 전달하면 메서드 내에서 변경 된 값이 호출 부에도 적용

메서드 오버로딩
 - overloading : 동일한 기능을 수행하는 메서드의 추가 작성
   - 일반적으로 메서드 이름은 기능별로 의미 있게 정함
   - 동일한 기능을 여러 형태로 정의해야 한다면?
 - println 은 사실 다른 메서드 들..
   - int, char, String...
   - 오버로딩 되어 있기에 타입별 다른 이름으로 안 불러도 괜춘
 - 장점 : 기어갷야 할 메서드 감소, 중복 코드에 대한 효율적 관리 가능
 
 - 방법
   - 메서드 이름은 동일
   - 파라미터의 개수 또는 순서, 타입이 달라야 할 것
     - 파라미터가 같은면 중복 선언 오류
   - 리턴 타입은 의미 없음.

 - 중복코드를 제거하라.
   - work() => work(15) => work(15, "inch") 에서 출력.

하나하나는 object.
전체는 클래스의 instance

보충 19-20시


기본 제공형 8개 

주간평가
2문제 주관식 서술형
5~7 간단한 단답형, 대소문자 구분!
java.lang.Object
나머지 4지선다

ctr + shirt + - - => 코드 창 분리

null 사랑해.

4방탐색 중요...!

2차원 배열
for(int[] b:a) sysout(Arrays.toString(b));
sysout();

스캐너.
 - sc.nextChar는 없다.
 - char ch = sc.next().charAt(0);

sc.nextInt() 와 sc.nextLine() 같이 쓰면 ERROR.

if(name.equals("*")){ // 한 글자라도.
}

this. 을 붙으면 클래스 변수. 아니면 로컬변수.
profile
바르고의 다락방

1개의 댓글

comment-user-thumbnail
2023년 7월 18일

좋은 글 잘 읽었습니다, 감사합니다.

답글 달기