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
- 값 반환 시에 묵시적 형변환 적용
- void 면 return 생략가능
- 메서드 수행 중 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. 을 붙으면 클래스 변수. 아니면 로컬변수.
좋은 글 잘 읽었습니다, 감사합니다.