배움 __IL/TIL 1기

TIL : 14번째- 221216 [12-2-금]

Mo_bi!e 2022. 12. 16. 18:20

※ Keep in mind

 본 내용은 웹개발과정의 강의 중 내용을 복습을 위해서 메모한 것에 불과한 것입니다. 이러한 연유로 강의내용을 오인한 나머지 오기재 및 불기재가 있을 수 있으니 '참고'만 해주시길 바랍니다. 저의 경우에도 본 내용을 단순히 읽은 것이 결코 저의 것이라고 생각하지 않습니다. 본 내용은 복습를 위한 초기 내지 중간 과정에 불과한 것이고, 이후에 내용을 보충 후 인출 및 설명하기 과정이 있어야 비로소 복습의 단추가 어느정도 마무리 되어간다고 볼 수 있습니다.

 따라서 당초에 본 내용은 비공개였습니다. 그럼에도 불구하고 본 내용을 공개한 점은 함께 공부하는 동료들과 나눔을 바탕으로 배움과 성장의 공진화라는 소기의 목적을 달성에 어느정도 도움이 될수 있기 때문이라고 생각합니다.

 

I. INTRO : 물음

다른언어와 함수 개념이 같은가? (O)> 함수 중 가장 중요한것은 자르기 > 자르는 기준? 4가지(나재차집)

 

강 결합을 느슨하게, 유지 보수 수월하게 위해 그래서 객체지향프로그래밍이 필요하다. 

 

II. 객체지향프로그래밍

1. 데이터구조화

int id / String name / String email / String addr

다음 변수들은 어떤 데이터를 저장하기 위한 데이터?

무엇인지 정확히 모름 (학생데이터?, 직장인데이터?)

 

사람 스무고개로 나열해서 지목하지않고 이름이나, 타입을 이야기한다.

명시적인 이름을 이야기함 그 속성을 말하지않음

 

각각 다른 (메뉴, 로또번호, 회원, 성적) 목적인데, 프로그램간에 이름이 중복될 수 있다.

이런 경우 대안이 필요하다.

 

우리 스스로는 머릿속데이터를 구조화 해서 저장하고있다.

구조적이란 여러개를 묶어서 표현하는 것이다.

 

코드는 이해하기 쉬워야하는게 좋은데 내 머릿속은 구조화되어있다. 이런점에서 이해가 좋음

사고방식과 유사함 구조화는

이름 충돌에 걱정없이 단위로서 다른 목족 종류와 관계없이 이름짜기위함

 

C++ 는 구조체 클래스 두개있지만, java는 클래스만 나둠

구조체는 묶어주는 역할만하지만, 클래스는 묶 + 함수까지 역할을 줄 수있기 때문임

 

entity (개체) 

개념화된 형식을 '개체' 라고한다.

실제 존재하는 것에 대한 type

보편적으로 하나의 대상에 대해서 설명을 할때

제품의 높이, 가격등으로 설명하기 보다 하나의 개념화된 단위로 설명한다.

 

이러한 개체의 개념에 비추어서 구조화하여 별도의 클래스를 만드는 것이 우리의 사고방식과 유사한것으로 볼 수있다.

 

object (객체)

개체에 의해 실제로 존재하는 것

 

속성에 들어간 값에 따라 달라짐(스무고개의 답에 따라 대상을 찾는거처럼)

 

클래스는 데이터어서 사용하기위한 사용자가 형식정의

함수를 묶기위해 사용(캡슐화)

 

2. 구조화된 데이터

우리의 사고와 비슷한 구조적프로그래밍이 바람직함

package ex4.classTest;

public class Exam {
		int kor;
		int eng;
		int math;
		//이걸로 변수나, 객체를 선언이 가능하다
}
public class ExamApp {

	public static void main(String[] args) {

		Exam exam1= new Exam(); // exam1참조 , [kor][eng][math] 가 힙에 잡힘
		exam1.kor = 30; //heap 에있음, stack에 있는 이름으로 heap에있는 kor에 접근
		//상태변수, 제어변수는 개별적으로 변수를 쓴다.
		//그러나 관계변수는 묶어서 쓴다.
		// 묶지않으면 공유가어렵다.
	}
}

//상태변수, 제어변수는 개별적으로 변수를 쓴다.

//그러나 관계하는 묶어서 쓴다. 묶지않으면 공유가어렵다.

Member member ; //이것은 마치 낯선 사람의 이름을 들으나 머릿속에 떠오르지 않는상태 Null 상태(사기꾼임)

member = new Member();로 넣어준다. //heap의 Member의 객체와 stack의 참조변수 member을 연결한다.

 

3. 배열 사용에 대한 이해

- 클래스 배열은 객체 배열이 아니라 객체참조(객체이름)배열이다

 

public class ExamApp {

	public static void main(String[] args) {
		
        Exam[] exams = new Exam[3]; //Exam 참조변수만 3개 준비한거임 우측만은 아직공간없음
        exams[0].kor = 30; //이대로 하면 null point excep 이 발생한다 
        //(왜냐하면 가르키는 객체가 없음)
        //즉 참조를 할수없음을 의미한다 == null
	}
}

new Exam[3] 은 new로 만들어진 동적할당임 (실행해야 앎) 그래서 heap에 있음

stack은 미리 선언(예약)해야 함!

exams[0]= new Exam(); //이렇게 공간을 할당해서 참조해준다.
		//클래스 배열은 참조변수나 객체공간모두 heap에 있다.
		//그냥 객체의 참조변수는 stack 객체공간은 heap에 있다
		//이러한 차이점이 있다.
exams[0].kor = 30;
exams[0].eng = 30;
exams[0].math = 30;		

exams[1]= new Exam(); 
exams[1].kor = 30;
exams[1].eng = 30;
exams[1].math = 30;		

exams[2]= new Exam(); 
exams[2].kor = 30;
exams[2].eng = 30;
exams[2].math = 30;

이렇게 공간을 할당해서 참조해준다.

 

-<필요한능력>

1. 통역사능력(말을 코드로 바꾸기)

2. 오류찾아서 해결할 수 있는 능력 (용의자 찾는거 줄이기)

3. 문제해결능력

 

더이상 함수는 의미가없어진다.

함수는 외부값 영향을 안받아야하는데, 구조체 사용하는순간 외부파일 영향받으면 문제가 생긴다.

 

4. 객체의 멤버변수 출력관련 함수 구현

static void printExam(Exam exam){

    System.out.println("\n단독객체");

    System.out.printf("점수는  ");
    System.out.print(" 국어: " + exam.kor);
    System.out.print(" /영어: " + exam.eng);
    System.out.print(" /수학: " + exam.math);
    System.out.println();
    System.out.print("\n====================\n");
}

위와 같이 객체의 멤버변수 값을 출력할 수 있다. (일반적인 객체만)

 

static void printExam(Exam[] exams){
		
    for(int i= 0 ; i < 3; i ++) {	

        //이름 줄이는 방법
        Exam exam = exams[i]; //이름바꿔서 뽀개어서 쓰기도 가능
        printExam(exam); //함수 중첩해서 재 사용이 가능하게끔할수도있다.

        System.out.printf("%d번째 배열의 점수는  ", i+1);
        System.out.print(" 국어: " + exam.kor); //뽀개어 쓴 경우
        System.out.print(" /영어: " + exams[i].eng);
        System.out.print(" /수학: " + exams[i].math);
        System.out.println();
    }
    System.out.print("\n====================");
}

1)앞서 선언했던 클래스배열의 경우에도 마찬가지로 이용가능하다.

다만 배열과 함께 따라오는 반복문을 마찬가지로 이용해야한다.

 

2) 이 경우 인덱스넘버로 특정으로 인한 특정 클래스배열을, 일반적인 객체참조변수대입해서 일반적인 객체변수처럼 이용이가능하다.

결국 이 경우 printExam 배열이 아닌버전의 함수를 호출가능하다.

 

3) 또한 배열이 아닌 버전의 함수 호출 외에도, 일반적인 객체변수 자체로 해당 멤버변수로 곧바로 접근이 가능하다.

 

 


1. 보충

(1)개체와 객체 그리고 클래스?


(2) 클래스배열
클래스 배열에서 내가 이해한 것은

Exam[] exams = new exam[];

에서 new 는 새로 heap에 만들기는 하지만 그것이 객체가 아니라 참조변수를 만든다는 것을 받아 들일 수 있다.

 

그렇다면 본 클래스배열(혹은 객체배열?)은 어디에 사용할수있을까?
함께 공부하는 동료들의 견해는 우선 쉽게말하면 버전관리를 할때 하나의 객체에 대해서 여러가지 버전으로 배열화 시키면 유용할것 같다고 하였다.

다른 동료는 중첩되게끔 이용하지 않아서 용이 할수도 있겠다고 하였다.

 

2. 회고 

(1) 패캐지의 용이성 드디어 이해
기존에는 패키지를 그냥 하길래 따라했지만, 별도의 클래스 파일을 만들고 다른 클래스에서 특정클래스에 접근할때 패키지 단위로 한다는 점에서 그 용도 내지 용이성을 드디어 이해하게되었다.

(2) 객체 배열의 용도에 대한 이해

상술함 

+ 추가로 클래스배열과 일반 클래스객체를 같이 배우는 이유가 메모리에 할당되는 방식의 차이를 알게끔 해서 객체지향프로그래밍에 대해서 보다 더 잘 이해하기 위해서 알려주신게 아닌가 싶다.


(3) 함수안에 다른 함수를 호출할수 있다는 것을 알게되었다.

특정 자료형의 배열을, 단독자료형으로 대입후에

단독자료형를 매개변수로 받는 함수호출이 가능하다는 것을 알게 되었다.

'배움 __IL > TIL 1기' 카테고리의 다른 글

TIL : 16번째- 221220 [12-3-화]  (0) 2022.12.20
TIL : 15번째- 221219 [12-3-월]  (1) 2022.12.19
TIL : 13번째- 221215 [12-2-목]  (0) 2022.12.15
TIL : 12번째- 221214 [12-2-수]  (0) 2022.12.14
TIL : 11번째- 221213 [12-2-화]  (0) 2022.12.13