[TIL] JAVA - 4일차

배고픈메꾸리·2021년 1월 21일
0

SSAFY

목록 보기
3/22

OOP

  • 캡슐화
    하나의 클래스 안에 데이터와 기능을 담아 정의하고 중요한 데이터나 복잡한 기능등은 숨기고 , 외부에서 사용에 필요한 기능만을 공개하는 것 (3대특징에는 빠짐 ...)
  • 상속
    객체 정의시 기존에 존재하는 객체의 속성과 기능을 상속받아 정의하는 것
  • 다형성
    같은 타입 또는 같은 기능의 호출로 다양한 효과를 가져오는 것
  • 추상화
    현실 세계에 존재하는 객체의 주요특징을 추출하는 과정

Object

시스템의 대상이 되는 모든 것
학생관리 시스템 : 학생, 교사 , 출결 ,성적
쇼핑몰 : 상품 , 고객 , 주문

Class

Object들의 공통적인 내용들을 추상화해서 표현한 것

  1. 어떤 시스템에서 class가 사용되냐에 따라 관점이 달라짐
    attribute : 정적인 특징
    behavior : 동적인 특징

Phone phone = new Phone();  // syso하면 주소를 리턴함
phone.name = "Galaxy Note";  // object new constructor
phone.color = "B"; 	// member variables
phone.price = 10000; // method call
### 

class type으로 변수를 선언하고 new라는 keyword를 사용하는데 , 그 뒤에는 생성자가 온다.
new => 뒤의 생성자를 보고 그에 맞게 memory allocation을 수행한다.

Phone phone = new Phone(); //new 뒤에 있는 Phone을 보고 만듬

만약 생성자를 만들지 않았으면 컴파일러가 기본생성자를 자동으로 만들어줌 기본 생성자는 Parameter가 없는 특별한 작업을 수행하지 않는 가장 단순한 생성자

생성자를 만들었다면 컴파일러는 아무런 생성자를 만들어 주지 않는다.

생성자는 Parameter를 가질 수 있다. 그리고 Parameter를 달리하는 여러개의 생성자를 만들 수 있다. 이렇게 하면 다양한 방법으로 객체를 만들수 있게 된다.

=> Parameter를 받는 생성자를 만들때도 기본 생성자는 만들어 주자!

public Phone(String name){
	this.name = name;  // 이 때 this는 만들어진 객체 자신 
}

class에는 접근제어자로 public default 두가지만 가능함
public class 는 파일명과 동일한 클래스만 붙일 수 있음

member variables

멤버 변수는 각 타입의 초기값이 들어가 있음 (전역변수임)

class를 이용해서 object를 만든다는것은 표현해야할 대상이 존재한다는 것 member variables를 통해 다양한 상태를 표현

class를 정의하면서 , 생성자에 parameter에 값을 전달 하면서 생성가능

member variables 값을 외부에서 직접 Set 할 수 있다...?
OOP에서 member varialbes 의 Set은 외부에서 마음대로 할 수 없도록 Class 내부에서 제어할 수 있는 구조를 가지는게 일반적이다.

this

나 자신을 가리키는 참조 변수 , 전역 변수 이상의 멤버에 접근이 가능 참조하고자 하는 곳에서 가까운 곳에 선언된 것을 참조한다.

Getter , Setter

OOP의 특징 중 하나로 Class 를 구성할 때 기본적으로 멤버변수와 메소드를 외부에 노출하지 않도록 가정하고 필요한 경우에 한해 외부에 노출

Phone phone = new Phone();

// By 생성자
public Phone(Stirng name){
	this.name = name;
}

// By Setters
public void setName(String name){
	this.name = name;
}

//By Getters
public String getName(){
	return name;
}

System.out.println(phone.getName());

getter setter 를 구현했다고 끝난것이 아님 여전히 멤버변수에 대해서 외부에서 직접 액세스 할 수 있다. getter setter를 제공하므로 외부에서 멤버 변수에 접근할 수 없도록 막아야 한다.
멤버변수에 있는 modifier를 public -> private 로 변경해야한다.

이클립스 우클릭 Source generate Getters and Setters 로 생성 가능

똑같은거 아닌가요?

만약 setter를 사용하지 않은 상태에서 변수를 public에서 private로 바꾼다면 코드를 다시 수정해야함. 임의로 생성자를 통해 변경할 수 없기 때문에!

오후 보강

public class OOP {
public static void main(String[] args){
	System.out.println();
    Math.abs(-3);
    int a; // 크기를 미리 알기 때문에 4바이트 미리 저장
    a = 3;
    Cup c1 = new Cup();  // 주소를 저장하는 참조형 변수는 c1은 4바이트
    }
}

주소를 저장하는 공간

  • CallStack : 메소드의 호출 정보를 저장하는 곳 , 지역변수
  • Heap :
  • ClassArea : 클래스의 정보

Array of Object

int[] intArray = new int[5];

위의 Primitive Type 처럼 객체도 배열을 만들 수 있다.
다음과 같은 코드가 있다고 하자. (오류)

Phone [] phoneArray = new Phone[5];

for (int i = 0 ; i < phoneArray.length ; i++) {
	phoneArray[i].setPrice(i*2000);
}

for ( Phone phone : phoneArray){
	System.out.println( phone.getPrice() );
}

Reference Type 배열을 만들고 배열 개별 요소에 객체를 할당하는 것을 잊지 말자.

Phone [] phoneArray = new Phone[5];

for ( int i = 0 ; i < phoneArray.length ; i ++){
	phoneArray[i] = new Phone();
    phoneArray[i].setPrice(i*2000);
}
for ( Phone phone : phoneArray) {
	System.out.println( phone.getPrice() );
}

JVM Memory Overview

Java 는 메모리 관리로 부터 자유롭다. JVM은 주요하게 3개의 메모리 영역을 가지고 있있다.

  • class Area : class , static , method
  • Heap : objects (new의 오른쪽에 있는 애들)
  • stack : method call
int i = 10;
String s1 = "Hello";
String s2 = new String("World");
Phone phone = new Phone("S20");

System.out.print(i);
System.out.print(s1);
System.out.print(s2);
System.out.print(phone);

GC

JVM은 Heap에 만들어진 객체 중 더 이상 참조되지 않은 것들을 대상으로 적절한 시점에 Garbage Collection 작업을 수행한다.

  • 우리는 GC에 직접 관여할 수 없다
  • 자동으로 처리된다는 점은 코딩 관점에서는 장점이지만 , 운영 관점에서는 단점이 된다.
  • 불필요한 객체 생성을 지양한다.

String

문자열은 기본적으로 가변적이기 때문에 Primitive Type 으로 표현하기 어렵다.
Java에서 문자열은 Class 로 정의하고 기본으로 제공된다.

Primitive Type 처럼 new 없이 바로 문자열의 값으로 줄 수도 있고 (string s = "Hello") Reference Type 처럼 new 연산자를 이용하여 값을 줄 수도 있다. (new String ("hello") )

int i1 = 10;
int i2 = 10;

String s1 = "hello";
String s2 = "hello";
String s3 = new String("hello");
String s4 = new String("hello");

i1 == i2
s1 == s2

== 는 두 변수의 메모리 값을 비교함
i1 i2는 지역 변수이므로 Stack에 만들어지고 Primitive Type 이므로 그 변수에 값이 저장됨

s1 s2는 상수들을 관리하는 메모리 공간에 저장 (8버전의 경우 힙 , 하드 코딩일 경우 재사용에 대비해서 저장해놓음) 그러므로 같은 주소를 가리킴

s3과 s4는 각각 new 에 의해 Heap에 서로 다른 객체를 생성하고 그 주소값을 저장

=> 문자열의 내용이 같은 지 확인하려면 equals를 사용하자

우리는 자주 복수개의 String 을 이어서 새로운 String을 만들게 된다. + 연산자를 사용하는 방법과 StringBuilder를 사용하는 방법을 알아보자

  • 연산자를 이용하면 그만큼 String 객체가 새로 만들어지므로 불필요한 객체가 많이 만들어 져서 성능에 영향을 미칠 수 있다.
//객체 3개가 만들어짐
String s1 ="Hello";
String s2 = "World";
String s3 = s1 + " , " s2;

// 적당한 크기의 배열(16칸)을 만들어 놓고 append하면 채우게 됨
// 꽉 차면 새로운 배열을 만들어서 활용
StringBuilder sb = new StringBuilder("");
sb.append(s1).append(",").append(s2);

System.out.println(sb.toString())

//컴파일러가 +는 StringBuilder로 자동으로 변환해 주지만
//루프를 돌 때는 자동으로 변환해 주지 않기 때문에 StringBuilder를 쓰자
String[] strArray = {"Hello", "," , "World"};
String str = "";
for (String s : strArray){
	str += s;
}

sb.setLength(0);
for( String s : strArray ){
	sb.append(s);
}

toString()

toString 메소드는 객체를 만들면 자동으로 만들어 지는데 (사실은 Object Class 로 부터 상속) 객체의 주소 정보를 String type으로 return 한다. 보통 재정의 해서 사용

Phone phone = new Phone();

phone.setName("Galaxy Note");
phone.setColor('B');
phone.setPrice(10000);

//toString 추가 전
System.out.println(phone);  // com.ssafy.Phone@6d06d69c

//toString 추가 후
System.out.println(phone); // Galaxy Not , 10000
...
<Phone class>
public String toString(){
	return this.name + "," + this.price();
}
private final String s1 ;
String s1 = "hi";

Pass By Value

자바에서 생성자 또는 메소드를 호출할 때 전달되는 파라미터의 값이 어떤 방식으로 전달될까 객체도 주소가 그대로 넘어감

Pass p = new Pass();
p.val = 10;
setVal(p) ; 
System.out.println(p.val); // 5

public static void setVal(Pass p) {p.val=  5;}

class Pass{
	public int val = 3;
}

Package

모듈별로 자바 파일을 나누어서 관리하는게 일반적 . 자바에서도 class를 Package라는 구조를 통해 계층적으로 관리
보통 www를 제외한 도메인의 역순 구조를 많이 사용
www.ssafy.com => com.ssafy

다른 package에 정의된 자바 모듈을 사용하고자 할 때는
import com.ssafy.Phone;
모든 자바 모듈을 가져오고자 할 때는
import com.ssafy.*;

Access Modifier

구분Same ClassSame PackageSub ClassUniverse
PrivateOXXX
(default)OOXX
protectedOOOX
publicOOOO

배포 : 우클릭 => properties => 탐색기 이동 압축해서 내면됨
내려받기(압축파일 그 자체) : package Explorer우클릭 => 임포트 => 제너럴 => existing projects from => select archive file => Browse

서울10_최동욱.zip 압축해서 메타모스트에 보내기

월말평가 평가 응시 위한 프로그램 설치 필수 진행

profile
FE 개발자가 되자

0개의 댓글