1. 참조타입
- new int[] numbers = new int[5] {1,2,3,4,5}
- 초기화 표현 : 선언문에서만
- numbers = {5,6,7,8}; : 초기화에서는 불가능
2. 메서드 영역 (크기 고정)
- 코드 파트 : 대부분 메서드가 차지함.
- 리터럴 상수
- 상수
- static
- heap
- stack : 쌓는 매카니즘, 빈틈 없음, 메서드 호출 때 지역 변수를 스택에 할당해서 운영함. 지역변수 초기화 안해줌(그러면 쓰레기값을 가짐.), 스택이 줄어들때 clear를 안해줌. top만 조정을 함.
static int[] getRandomArray(int length, int until) {
int[] data = new int[length];
Random r = new Random(5);
for(int i = 0; i < data.length; i++) {
data[i] = r.nextInt(until);
}
return data;
}
int[] jumsu = ArrayUtil.getRandomArray(10000, 331); // <= int[] jumsu로 값을 참조해주지 않으면
//ArrayUtil.getRandomArray(10000, 331); 이 쓰레기 값이 됨.
//☆ 그래서 int[] jumsu 로 왼쪽에서 값을 참조해주는 것이 매우 중요함 ☆
- return 값을 null로 바꿔주면 Null Point Exception (NPE) 발생함.
- return 값이 항상 참조를 한다고 생각하면 안됨. 어떤 이유에서 데이터가 누락할 수도 있음.
- 참조형은 대입연산이다.
- 주로 사용될 때는 매개변수 전달, return 값 받을 때 이다.
- 아직 안배운 것 2가지 : 2차원 배열, 배열 복사(특히 참조형 배열 복사를 하는 의미가 중요)
- 배열의 단점 : 크기(length)가 고정됨
< 클래스 >
- 학습목표 : 객체 지향 프로그래밍 (OOP)을 할 수 있다.
- 1980년대 : SW 위기, HW 발전속도를 SW가 쫓아가지 못함. 생산성이 아주 낮았음.
연구 결과, 절차적 프로그래밍은 CPU(기계)의 사고방식이었음.
사람이 기계적 사고방식을 쫓아서 프로그래밍을 하다보니 생산성이 낮은 것이었음.
그래서 사람의 사고방식으로 프로그래밍을 짜자는 의견이 나왔고,
사람은 문제를 풀 때, 또는 세상을 바라볼 때 어떻게 인지하는지 봤더니, 모든 것을 객체로 인식하는 것을 발견함.
그래서 프로그래밍 방식도 위와같이 바꿨더니, 재사용성, 가독성이 높아지면서 생산성이 높아짐.
-> 이러한 결과로 1980년대 말에 C++과 Java가 발명됨.
- 객체지향 프로그래밍이란?
* 부품을 조립하듯이 코딩하는 방식
* 건축과 유사
* PC조립과 유사
* 부품만 있으면 조립할 수 있음.
* 부품은 어디에 놔뒀다가? RAM에 저장해뒀다가..
* 조립은 누가? CPU가 함.
* 기본형 데이터는 변수에 값을 저장
* 변수 하나당 값 하나를 저장해야 함.
* 대부분의 부품은 데이터가 하나가 아님.
- 클래스의 의미
* 클래스 : 부류/그룹/종류/틀
* Class = 그룹핑(Grouping), 구분을 위한 포장지.
* 객체지향에서는 특정한 종류들이 가지는 공통적인 특징으로 만들어진 틀의 의미
* 예를 들어서 고양이 그룹과 강아지 그룹을 나눌 때, 공통된 성질(특성)과 행동 등으로 분류를 시킨다.
* 즉, 이 고양이 그룹과 강아지 그룹은 일종의 class라고 할 수 있다.
* class는 공통된 그룹을 의미한다.
- 객체 지향 프로그래밍(OOP, Object-Oriented Programming) :
객체(Object)란 실생활에서 사용하는 물건 또는 사물을 의미(부품).
객체지향은 프로그래밍의 접근 방법이 절차지향과는 완전히 다르다.
- OOP(객체 지향 프로그래밍)의 4대 철학
* Abstraction(추상화) - 구체적인 부품을 클래스라는 것으로 추상적으로 표현. (머릿속에 있는 개념을 구체화)
* Encapsulation(캡슐화) - 부품의 세부적인 동작 방식이 은닉되어 있는 것. (공통된 성질을 묶어서 관리)
* Inheritance(상속) - 부품을 재사용하여 새로운 부품을 만드는 것.
* Polymorphism(다형성) - 하나의 이름으로 다양한 형태를 사용할 수 잇는 것.
- 세탁기 + 건조기, 빨래 예제로 절차지향, 객체지향 비교
* 절차지향과 객체지향은 프로그래밍하는 접근방법이 완전히 다르다.
- 당신은 어떤 방법으로 프로그래밍 하겠는가?
* 절차적(순서대로 처리)
1) 물에 담군다.
2) 비누를 묻힌다.
3) 힘을 주어 빤다.
4) 많이 헹군다.
5) 밖에 널어 말린다.
* 객체지향적(1~5번까지 한꺼번에 찾는다.) 해주는 부품
1) 빨래 넣고, 세제 넣고, 버튼을 누른다.
2) 다 되면, 꺼낸다.
- 클래스(class), 객체(object), 실제(instance == object)
* 클래스는 일종의 붕어빵틀에 해당함.
* Objects : 세상에는 무수히 많은 붕어빵틀이 있다.
* Class : 붕어빵들의 공통점을 찾아서 틀로 만들어버리자.
* Instance(Object of Class) : 먹고 싶을 때마다 속에 들어가는 데이터만 다르게 해서 얼마든지 만들어 먹을 수 있게 되었다.
(슈붕, 팥붕, 피붕 등...)
- 자동차 생산 과정
* Car class (틀)
* new라는 키워드를 통해 인스턴스를 만들어 냄.
* Object == instance
자바에는 수많은 클래스가 널려있음.
각 부품(물건)의 고유한 특징(속성 + 동작)을 가지고 있다.
프로그램 변수로 공통적으로 가지고 있는 특징....
- 추상화 과정
* 텔레비전의 공통적인 특징 ==> TV
* 성질(특성) : 크기(*), 가격(*), 제조회사, 구매처 ==> 멤버변수로 표현.
* 동작(기능) : 전원을 켜다(*), 전원을 끄다(*), 채널을 바꾸다...
==> 기능을 수행합니다.(function, 함수)
==> 방법(method, "메서드") == 함수
==> 멤버메서드
==> class(틀)로 만들어서 텔레비전이 필요할 때 new를 이용해 부품을 만듭니다.
class Tv {
int size; <=값
int price; <=값
String manufacture; <=값
String where; <=값
void on() {...}
void off() {...}
void changeChannel() {...}
}
==> 실제로 여기에 들어가는 값(변수, 상수)들은 다 고유한 특성을 가지고 있음. (성질의 공통점)
==> 메서드(함수)들은 공통된 기능(행동)들을 의미함.
==> 공통된 것들끼리 묶는 것을 캡슐화라고 함.
메모리에 할당, 실제 변수에 해당하는 실제값을 운영하는 녀석 = 인스턴스(Instance, 객체)
이것을 만드는 것 = new라는 키워드
- 전화기(휴대폰)의 특징을 정리해보자. : 하나의 클래스는 변수와 메서드로 구성되어있다.
* 속성(attribute) - 변수
* 행동 - 메서드
* 객체 생성 : 실제 사용할 대상이 되는 전화기 생성, 클래스의 실제라고 해서 클래스의 인스턴스 라고 함.
** 전화기는 2개가 만들어짐.
** 각각의 전화기를 만들 때 값을 넣어줌.
** 전화기의 기능 중 일부를 사용하면 됨.
** p1, p2는 어떤 변수인가..?(이거는 코드 봐야함.)
- 클래스 하나당 퍼블릭 클래스 하나는 있어야 하며, 그 퍼블릭 클래스의 이름은 자바파일 이름과 같아야 함.
- SRP : Single Responsible Principle (단일 책임의 원칙)
* 클래스는 클래스 하나만 생각하고 만들어야지, 다른 것을 생각하면 안됨.
- 클래스 안에 정의된 변수는 멤버변수, 클래스 안에 정의된 메서드는 멤버메서드 라고 함.
* 하지만 자바에서는 큰 의미가 없음. 어차피 지역변수를 제외한 것들은 다 멤버변수, 멤버메서드 이기 때문.
* 인스턴스 변수가 더 핵심적임.
- 인스턴스 변수 : 인스턴스마다 다른 값을 적용해서 쓰는 변수.
즉, 우리가 만든 클래스의 변수를 가져다가 쓰는 변수를 인스턴스 변수라고 함.
처음에
전화기 p1 = new 전화기();
라고 할당했을 때, null 값을 가짐.
(new ~~();는 항상 모든 값을 0으로 초기화 시키는데, 전화기는 string 이므로, null 로 초기화됨.)
<클래스 추상화 확인문제>
- 텔레비전의 공통적인 특징 ==> TV
* 성질(특성) : 크기(*), 가격(*), 제조회사, 구매처 ==> 멤버변수로 표현!
* 동작(기능) : 전원을 켜다(*), 전원을 끄다(*), 채널을 바꾸다...
==> 기능을 수행합니다. (function, 함수)
==> 방법(method, "메서드") == 함수
==> 멤버메서드
==> class(틀)로 만들어서 텔레비전이 필요할 때 new를 이용해 부품을 만듭시다.
- 변수를 만들때 생각해야 할 2가지 : life time, access scope
* life time (생존시간) : new ~~(); 했을 때 생성, garbage가 될 때 까지.
* access scope(접근 경로) : 이것은 public 때문에 한번에 정의하기가 힘듦.
public의 경우에, 참조만 있으면 어디서든지 다 접근이 가능함. (바깥이든, 안이든)
public이 아닌 경우(private일 때), 해당 메서드 안에서만 사용 가능함.
따라서 접근 경로는 앞에 무엇이 붙는지가 결정함.
- Tv myTv = new Tv(); 에서 myTv는 변수이다.
- Tv는 타입이다.
- int myTv = 10; 과의 차이는 무엇일까?
- int는 자바에서 정의했고, Tv는 개발자(사용자)가 정의한 타입인 것이다.
- 따라서 Tv는 사용자 정의 타입이라고 한다.
- Car c1 = new Car(); 에서 new Car();은 인스턴스 참조(주소) 라고 함.
- HDD(Hard Disk) 에서 저장장치로 메모리(MM)를 올리는 것을 로드라고 하며, 그것을 올리는 역할을 하는 것을 Loader라고 함.
- 파일명과 클래스명이 같아야 하는 이유 : 동적로딩을 할 때, 클래스 명을 먼저 찾고 난 후, 파일명을 찾기 때문에. ==> 이 작업을 하는 것을 Class Loader라고 함.
- 인스턴스 변수 VS 지역변수 (원래 pdf에서는 전역변수라고 되어있지만, 사실 자바는 전역변수가 없다.)
- 특수변수
- 접근 제어자
* default (아무것도 안적으면) : 같은 패키지 안에서는 접근 가능 -> 비권장.
* protected : 상속과 관련
* public : 다른 패키지에서도 접근 가능
* private : 한 클래스 안에서만 접근가능하게 하겠다. (한 클래스 안에서만 핸들링 하겠다.)
멤버변수는 private,
멤버메소드는 public 이 권장사항이다.
멤버변수를 수정할 일이 있으면, 메소드로서 수정하도록 해주는 것이 권장사항이다.
==> 이것을 데이터 은닉 이라고 한다. (캡슐화의 특징)
- 메서드 (method)
- 객체가 생성될 때, 메서드는 어떻게 되나?
- 우리가 만든 클래스를 참조할 클래스를 하나 만들고, 거기에 인스턴스 변수와 인스턴스 메서드를 각각 만들었을 때,
- 인스턴스 변수는 Heap Account 안에 생성되고,
- 인스턴스 메서드는 method 영역 안에 단 1벌만 생성된다.
- 메서드명은 메서드가 어디에 있는지, 참조값(주소값)을 나타내는 것이다.
- 실행 위치를 print()의 위치로 이동시켜라. (호출)
callback 함수 -> 어떤 함수를 호출할때 함수명을 넣어서 넘겼다 -> 주소값을 넘긴 것.. = call by reference (? 내가 들은 설명이 이게 맞는지 정확하지 않음..)
- 오버로딩 : 자주 쓰는 기능임.
- toString()은 @Override로 상속을 의미한다. (이거랑 헷갈리지 말자.)
- OverLoading : 동일한 식별자를 2번 선언 못한다. (함수에서도 동일하게..)
int a;
int a;
==> 안됨!!
하지만, 예외가 있음.
함수명은 같지만, 매개변수가 다르면 다른 함수로 간주함. (타입, 개수 모두를 고려함)
단, 리턴 타입은 보지 않음.
public void add() => add()
public void add(int x, int y) => add(100, 200)
===> 둘은 다른 함수임.
스크립트 언어와 파이썬은 Overloading(오버로딩)이 지원이 안됨.
하지만, 컴파일 언어(JAVA)에서는 지원되는 기능임.
- ArrayList<타입> 이름
- 배열의 단점을 보완한 것..
- 너무 일찍나와서 일단 오늘은 패스!
파일 접근 (정규표현식) -> 이것도 순서를 뒤로 미룸.
- 생성자 / static
- 학습목표 : 생성자를 이용하여 멤버변수를 초기화할 수 있고, static을 사용할 수 있습니다.
- 인스턴스(instance)를 만드는 것.
- 인스턴스는 어떻게 만들어지는가? new 클래스명();
- 생성자 메서드
- constructor, 객체생성시 클래스이름과 동일한 메서드가 있으면 자동호출되는 메서드.
- ex) Account dad = new Account();
* new Account() 에서 ()는 호출이라는 의미를 가진다.
==> new 메서드명();였을 때 생성자 메서드가 호출됨.
==> 생성자 메서드의 의의 : private 인스턴스 변수 초기화
- 생성자
* new를 이용해서 객체생성시 자동호출
* 생성자는 메소드임.
* public 클래스이름() : 생성자는 클래스이름과 동일!!
* 반환유무를 쓰지 않음 : 무조건 void이므로 안써줌(x), 그냥 무조건 return 값을 안써줌. -> new 메서드명(); 은 참조값이 return 되기 때문에. return을 쓰면 에러.
* 생성자는 오버로딩 할 수 있다.
* 오버로딩은 메소드 이름을 동일하게 쓸 수 있음.
* 생성자는 여러 개 만들 수 있다.
* 입력값을 다르게 해야한다.
* new 계좌()
* new 계좌("홍길동")
* new 계좌("홍길동", 1000)
* 생성자 오버로딩을 통해서 객체생성 조건을 한정시킬 수 있다.
- 생성자의 역할 : 객체생성과 동시에 멤버변수 초기화
- ex) Tv myTv = new Tv(7, "켜짐"); -> 0으로 값 초기화 안하겠다는 의미.
- 생성자는 왜 사용하나요? : 객체 생성시 자동으로 해야 할 작업이 있으면 생성자 내에 넣어주면 됨.
- 객체 생성시 자동으로 해야 할 작업은 무엇인가? : 멤버변수 초기화
- 생성자는 메소드이다.
* 반환여부를 명시하지 않는다. (무조건 void)
* 대문자로 시작하는 유일한 메소드
* 동일한 이름으로 여러 개 만들 수 있다. (다형성)
* 메소드의 입력값으로 구분(매개변수의 개수, 순서, 타입)
- 파라미터(매개변수) 없는 생성자를 기본생성자(default constructor)라고 함.
- 기본 생성자는 다른 생성자가 없는 경우 자동으로 만들어준다. (묵시적 생성이 되었음.) -> 누가? 컴파일러가.
- 다른 생성자가 있는 경우 명시적으로 만들어주어야 한다. (명시적 생성을 해야함.)
- 생성자가 왜 필요한지 통장을 만들어서 도출예제
- 기본생성자, 파라미터 있는 생성자(파라미터 1개, 2개, 3개 추가)
- this.는 고정된 값이 아니고, 참조변수이며, 자기자신을(자기자신의 인스턴스) 가르킨다.
- 누구를 통해서 호출됐느냐에 따라서 값이 바뀐다.
- 모든 메서드에는 this라고 불리우는 참조변수가 세팅됨.
- 최초의 자바 버츄얼머신에 의해서 호출된 녀석으로 세팅되서 들어감. 값을 읽어올수만 있다.
☆ 오늘 배운 것 중에서 제일 중요한 파트 ☆
- 생성자, this의 의미
- 다형성
* overloading은 가장 낮은 레벨에서 지원하는 다형성임.
- 오늘 반드시 알아야 할 핵심 -
- new : 생성자 호출(), 인스턴스 생성
- this의 참조 의미.
내일 배울 것 : static
'멀티캠퍼스 > Spring' 카테고리의 다른 글
20230809 (수) (0) | 2023.08.09 |
---|---|
20230808 (화) (0) | 2023.08.08 |
20230731 (월) (0) | 2023.08.04 |
20230802 (수) (0) | 2023.08.02 |
20230801 (화) (0) | 2023.08.01 |