반응형

cs50

 

1.Linear Search

왼쪽부터 오른쪽으로 하나하나씩 조회한다.

 

랜덤으로 되여있다.

o(n)

 

2. binary search

sord 되여있는 것을 

중간 중간 이런식으로 한다.

bi => two

divide conquer

o(log n)

 

big O -> O worst case

 

 

3. bubble sort

bubble sort 옆에 있는것과 비교하여 바꾼다.

 i , i+1

i 위치에 있는것 이 i+1 보다 크면 바꾼다.

O(n**2)

 

4. selection sort

한줄 보면서 제일  작은 것을 기억해서 처음과 잴 작은 것을 바꾼다.

0-> n-1

n(n-1)/ 2 => O(n**2)

 

5. insertion sort

 

 

6. recursion

left right 나누어서 한다. 

 

7. merge sort

left , rigth  따로 따로 하고 합친다.

7 4 5 2   6 3 8 1

4 7     

4 7 2 5

2 4 5 7 

 

6 3 8 1

3 6 1 8

1 3 6 8

 

2 4 5 7 1 3 6 8

 O( n log n )

 

 

반응형

'Deep learning > 개념' 카테고리의 다른 글

Optimizer  (0) 2021.03.27
Activation Function  (0) 2021.03.27
DBN  (0) 2021.03.27
top-1 and top-5  (0) 2020.08.18
선형회귀분석 ,군집화 ,다층 계층 신경망 ,병렬처리 ,부록 A: 한국어판 : 순환 신경망과 LSTM  (0) 2020.08.18
반응형

**데이터 정렬
1. 정렬의 구분
1)오름차순(Ascending - 작은것에서 큰것 순으로 배치, 기본)과 내림차순(Descending - 큰것에서 작은것순으로 배치)

2) 알고리즘에 의한 분류
-selection sort(선택정렬) : 교재에서 많이 설명, 정렬이 무엇인지 설명하고 제어문 학습하는 용도로 주로 이용, 실무에서는 거의 사용하지 않음 (성능이 좋지않음)

- bubble sort
- insertion sort
- quick sort-재귀함수

- shell sort
- heap sort
- radix sort

=> 면접이나 코딩 테스트에서는 quick sort를 많이 물어봄

 

2. Selection sort(선택정렬)

20 30 40 50 10:정열되지 않은 상태

=>첫번째 위치부터 마지막 바로 앞 위치까지 자신의 뒤에 있는 모든 데이터와 비교해서 더 작은 데이터를 자리 바꿈을 하는 방식으로 데이터를 정렬

1pass(0) 10 30 40 50 20 : 1,2,3,4

2pass(1) 10 20 40 50 30 : 2,3,4

3pass(2) 10 20 30 50 40 : 3,4

4pass(3) 10 20 30 40 50 : 4

끝나는 자리가 같다 시작 자리만 변한다.

 

int[] ar = [20 30 40 50 10]

 

//선택 정렬

for (int i = 0; i < 4; i++){

           //비교 위치 반복문

           for (j =  i+1 ; j < 5 ; j++){

                       if(ar[i] > ar[j]){

                                  //swap =>python빼고 대부분 언어는 이렇게 한다.    

                                  int temp = ar[i];

                                  ar[i] = ar[j];

ar[j] = temp;

                       }

}

}

 

===>

int len = ar.length;

for (int i = 0; i < len-1i++){

           //비교 위치 반복문

           for (j =  i+1 ; j < len ; j++){

                       if(ar[i] > ar[j]){

                                  //swap =>python빼고 대부분 언어는 이렇게 한다.    

                                  int temp = ar[i];

                                  ar[i] = ar[j];

ar[j] = temp;

                       }

}

}

 

pythonswap : (a,b) = (b,a)

오름 차순 내림차순 는 부등호 방향 바꾼다. < >

일반화 시킬 수 있어야 한다.

4,5 등 안고쳐도 되게끔 바꿔야 한다. MVC 데이터 LENGTH로 해야 한다.

 

                       int [] ar = {20,30,40,50,10};

                       //선택 정렬은 첫번째 부터 마지막 바로 앞 데이터 까지

                       //자신의 두에 있는 모든 우치의 데이터와 비교해서 정렬

                       //오륾차순이면 뒤의 데이터가 작을 때 swap

                       //내림찬순이면 뒤의 데이터가 클 때 swap

                      

                       //첫번째 부터 마지막 바로 앞 자리까지

                       //상수를 이용하면 안좋은 점이 데이터가 늘어나면 마지막에는 sort가 안된다.

                       //상수를 이용하면 데이터가 줄거나 늘어나거나 하면 문제가 생긴다.

                       for (int i = 0; i < 4; i++) {

                                  //기준의 뒤에 있는 모든 데이터와 비교해서

                                  for (int j = i+1; j < 5; j++) {

                                              //기준점의 데이터가 크면 swap

                                              if(ar[i] > ar[j]) {

                                                         int temp = ar[i];

                                                         ar[i] = ar[j];

                                                         ar[j] = temp;

                                              }

                                  }

                       }

                      

                      

                       //이것으로 변경

                       int len = ar.length;

                       for (int i = 0; i < len-1; i++) {

                                  //기준의 뒤에 있는 모든 데이터와 비교해서

                                  for (int j = i+1; j < len; j++) {

                                              //기준점의 데이터가 크면 swap

                                              if(ar[i] > ar[j]) {

                                                         int temp = ar[i];

                                                         ar[i] = ar[j];

                                                         ar[j] = temp;

                                              }

                                  }

                       }

                      

                      

                       //데이터 출력

                       for(int temp : ar) {

                                  System.out.println(temp + "\t");

                       }

 

lotto개선

                       //키보드로 부터 데이터를 입력받기 위한 객체를 생성

                       Scanner sc = new Scanner(System.in);

                      

                       //1-45까지의 정수 6개를 저장할 자료구조를 생성

                       int[] lotto = new int[6];

                      

                       //6번 반복

                       for (int i = 0; i < 6; i++) {

                                  //정수를 입력받아서 su에 저장

                                  System.out.print(i + "번째 숫자:");

                                  int su = sc.nextInt();

                                  //1부터 45까지의 숫자만 저장하고 그 이외의 경우는 다시 입력하도록 하기

                                 

                                  if (su  < 1 || su > 45) {

                                              System.out.println("1-45사이만 입력하세요");

                                              //이번 입력은 무효화

                                              //뒤로 왔다가 다시 한칸 가니깐 원래 자리로 된다.

                                              i = i -1;

                                             

                                              //아래로 내려가지 않고 다음 반복으로 넘어가기

                                              continue;

                                  }

                                 

                                  //데이터 중복 검사

                                  if(i > 0) {

                                              boolean flag = false;

                                              //현재것 이전 까지 비교한다.

                                              //첫번째 데이터 부터 현재 입력할 데이터 앞까지 비교

                                              for(int j = 0; j < i; j++) {

                                                         //현재 입력받은 데이터와 같은지 비교

                                                         if(lotto[j] == su) {

                                                                     flag = true;

                                                                    System.out.println("중복된 데이터입니다.");

                                                                     //더이상 비교할 필요가 없음

                                                                     break;

                                                         }

                                              }

                                              //이전 데이터와 동일한 데이터를 만나면 다시 입력받도록 작성

                                              if(flag == true) {

                                                         i = i-1;

                                                         continue;

                                              }

                                             

                                  }

                                 

                                 

                                  //입력받은 데이터를 배열에 저장

                                  lotto[i] = su;

                       }

                      

                       int len = lotto.length;

                       for (int i = 0; i < len-1; i++) {

                                  //기준의 뒤에 있는 모든 데이터와 비교해서

                                  for (int j = i+1; j < len; j++) {

                                              //기준점의 데이터가 크면 swap

                                              if(lotto[i] > lotto[j]) {

                                                         int temp = lotto[i];

                                                         lotto[i] = lotto[j];

                                                         lotto[j] = temp;

                                              }

                                  }

                       }

                      

                       //입력받은 데이터 출력

                       for(int temp: lotto) {

                                  System.out.println(temp + "\t");

                       }

                      

                       sc.close();

 

 

3.Bubble Sort

=>최대 n(데이터 개수)- 1회전 동안 맨 앞에서 부터 자신의 바로 뒤에 있는 데이터와만 비교해소 정렬하는 방식

20 30 40 50 10

20 30 , 30 40, 40 50, 50 10 이렇게 비교한다.

=>항상 1회전이 끝나면 가장 큰 데이터가 맨 뒤로 이동

=>1회전 동안 데이터의 이동이 없으면 정렬이 된 것ㅇ이므로 중단해도 됩니다.

 

a:90

b:100

c:70

selection sort : a>b a>c bc의 관계를 알 수없다.

bubble sort a>b, b>c 연속해서 비교 하기 때문에

sort quick sort 재귀를 사용해서 메모리 많이 사용한다.

 

for(int i = 0; i < len-1; i++){

           //1회전

           boolean flag = false; //이 함수 들어갔는지 안 들어갔는지 확인하는 방법

           for(int j = 0; j < len- i-1; j++){

                       //위치 이동

                       if(ar[j] > ar[j+1]){

                                  int temp = ar[j];

                                  ar[j] = ar[j+1];

                                  ar[j+1] = temp;

                                  flag = true;

                       }

}

if(flag == false){

           break;//위치 변경 있는 지 없는지

}

}

20 30 40 50 10

20 30

30 40

40 50

50 10 -> 20 30 40 10 50

20 30

30 40

40 10 -> 20 30 10 40 50

                       int[] ar = { 20, 30, 40, 50, 10 };

                       // 버블 정렬은 최대 n(데이터 개수)-1 회전 동안

                       // 자신의 바로 뒤에 있는 데이터와 비교해서 정렬

                       // 오름차순이면 뒤의 데이터가 작을 때 swap

                       // 내림차순이면 뒤의 데이터가 클 때 swap

 

                       // 버블 정렬은 가장 큰 데이터가 맨 뒤로 이동하므로 하나의 회전이 끝나면

                       // 맨 마지막 데이터와는 비교할 필요가 없습니다.

                       // 1회전 동안 데이터의 이동이 없으면 정렬 종룔

                       int len = ar.length;

 

                       // 최대 n-1회전

                       for (int i = 0; i < len - 1; i++) {

                                  // 1회전 동안의 데이터의 이동 여부를 판별하기 위한 변수

                                  boolean flag = false; // 이 함수 들어갔는지 안 들어갔는지 확인하는 방법

                                  // 자신의 인접한 데이터와 비교하기 위한 제어문

                                  for (int j = 0; j < len - i - 1; j++) {

                                              // 위치 이동

                                              // 뒤의 데이터가 더 작으면 swap

                                              if (ar[j] > ar[j + 1]) {

                                                         int temp = ar[j];

                                                         ar[j] = ar[j + 1];

                                                         ar[j + 1] = temp;

                                                         // 데이터 이동 여부 표시

                                                         flag = true;

                                              }

                                  }

                                  // 데이터의 이동이 없으면 정렬 종료

                                  if (flag == false) {

                                              break;// 위치 변경 있는 지 없는지

                                  }

                       }

                      

                       //데이터 출력

                       for(int temp : ar) {

                                  System.out.println(temp + "\t");

                       }

 

**검색(search)

1.    순차검색

=>데이터가 정렬되지 않았을 때 앞에서부터 순서대로 검색

=>첫번째 데이터와 마지막 데이터의 검색 시간이 차이가 많이 나고 데이터가 없는 경우 전체 데이터를 확인해야만 없다는 사실을 알 수 있습니다.

 

2.    제어검색

=>데어터가 정렬된 경우 사용하는 검색 방법

1) 이분 검색(binary search):데이터의 중앙값고과 비교해서 작으면 왼쪽 크면 오른쪽에 가서 다시 중앙값과 비교하는 방식

1 2 3 4 5

가운데 간다. 3을 중앙값 기준으로 (4 5)

15개 데이터가 있으면 15번 가봐야 하는데 하나하나씩 확인해야 하는데 이분 검색을 사요앟면

27 있는지 확인

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

278보다 크다. 그래서 오른쪽으로 간다.

9 10 11 12 13 14 15 -> 27

12 13 14 15 -> 27

14 15 ->27

4번으로 검색한다.

컴퓨터 프로그램에서는 많이 사용하는데

2)피보나치 검색: 피보나치 수열의 값을 이용해서 검색

1,1,2,3,5,8,13,,,(첫번째 와 두번째는 1 세번째 부터는 앞쪽 2개 항의 합)

spin으로 할때 간격으로 크진다.

 

 

3) 보간 검색

=>검색위치를 계산해서 검색=> 실생활에서 많이 사용한다.

프로그램에서는 피보나치나 이분 검색 많이 사용한다.

 

(검색값- 최소값)/(최대값 - 최소값) 을 계산한 후 데이터 개수와 곱해서 찾는 방식

데이터의 분포가 고르다면 제어검색 중에서 성는이 우수함

데어터의 분포를 컴퓨터가 잘 모르기 떄문에 binary search로 한다.

 

4)이진 트리 검색

=>데이터를 삽일할 때 정렬 하는 것 처럼 작으면 왼쪽 크면 오르쪽에 배치해서 검색

=>이진 트리는 만들다 보면 정확하게 반으로 분할 되지는 않습니다.

 

3.    블록 검색 =>서점 예: 알라딩

=>블록 단위는 정렬되어 있지만 블록 안은 정렬이 안된 상태에서 검색

 

4.해싱

=>데이터를 배치할 때 함수를 이용해서 배치하는 방식

=>모든 데이터의 검색 속도가 일정하고 가장 빠른 검색 방법

=>해싱 함수의 선택은 운영체제가 합니다.

dict등 은 순서를 모른다.

**객체 지향 프로그래밍(object oriented programming -OOP) =>3대 특징

1.    객체지향 특징

1)    Encapsulation(캡슐화): 관련있는 속성과 메소들 묶는 것

클래스를 만드는 방법

 

2)    Inheritance(상속성):상위클래스의 모든 것을 하위 클래스가 물려 받는 것

 

3)    Polymorphism(다향성):동일한 메시지에 대하여 다르게 반응하는 성질

=>동일한 코드가 호출하는 객체에 따라서 다른 메소드를 호출 하는 것

 

2.객체 지향의 장점

=>코드의 재사용성이 뛰어남

 

3.객체지향의 단점

=>함수형 프로그래밍 방식에 비해서 무겁다.

 

hbase-> java 안정적이다.

mongodb->c++ 

hbase mongodb보다 무겁다.

객체 지향은 감싸서 큰 것 만들때는 좋다.

함수형 프로그램이 가볍다.

 

빅데이터 처리는

빅데이터 분석 자바에서 함수형 프로그램하는 것이 생겼다. scalar,closure, kotalin

r , python

java는 근본적인 객체지향

python는 선택가능하다.

cc++보다 쉽다.

 

4.클래스와 인스턴스(객체 - 예전에는 object)

=>최근에는 클래스도 오브젝트로 간주합니다.

=>클래스는 인스턴스들의 공통된 특징을 소유한 객체

=>클래스를 기반으로 해서 생성된 객체들을 인스턴스 라고 하기도 합니다.

클래스는 모델하우스 ->집의 최소가 된다.

객체는 집

모델하우스 보다 적으면 문제가 있다.

클래스는 설계도 같은 개념이여서 틀을 만들고 instance는 집이 된다.

설계도를 만들고 설계도를 참조하면 되니깐

객체를 component based

=>클래스는 정적(한 번 만들면 수정이 안됨)이고 인스턴스는 동적(만들고 수정하고 삭제 할 수 있습니다.)

=>클래스는 만들고 처음 사용할 때 메모리에 로드가 되서 프로그램이 종료될 때 까지 절대로 소멸되지 않습니다.

=>인스턴스는 만들어서 사용하다가 필요하면 언제든지 제거할 수 있습니다.

 

5.자바에서 클래스를 생성하는 방법

[접근 지정자] + [클래스 종류]+class+ 클래스 이름 +[extends 상위클래스이름] +[implements 인터페이스이름]{

      클래스의 구성 요소 나열

}

 

6.클래스를 이용해서 인스턴스를 생성하는 기본 방법

new 생성자이름(매개변수 나열)

=>new는 생성자를 기반으로 메모리 할당(allocation)을 하고 초기화(initialize)를 한 후 그 참조를 리턴합니다.

=>자바는 생성자 이름이 클래스 이름이어야 합니다.

 

7.클래스의 구성 요소

=>속성(attribute-변수)

=>메소드(method) :클래스 안에 만들어져서 클래스 이름이나 인스턴스 이름으로 호출한느 함수를 메소드라고 합니다.

=>생성자(constructor)

 

8.클래스나 인스턴스를 가지고 자신의 멤버 접근

클래스 또는 인스턴스 , 속성이름 또는 메소드 이름(매개변수 나열) 의 형태로 접근 합니다.

 

**클래스 생성

1.클래스의 접근 지정자

=>생략(default, package - 디렉토리) : 현재 패키지에서는 마음대로 사용할 수 있지만 다른 패키지에서는 사용을 못함

=>public : 어디에서든지 이 클래스를 사용할 수 있습니다.

=>private :다른 클래스에서 이 클래스를 사용할 수 없도록 할 때 사용, 내부 클래스에만 적용

=>protected : 상속받은 클래스에서는 사용이 가능. 내부 클래스에만 적용 가능

불필요한 것 사용하지 말아라 private

self.__ =>private

 

2.자바에서는 클래스 별로 별도의 파일에 작성하는 것을 권장(python도 이부분은 같다.)

 

3.클래스를 생성하고 인스턴스 만들기

1) 클래스 만들기

=>src디렉토리 위에 마우스 포인터 올리고 마우스 오른쪽을 누른 후 [New] - [Class]를 선택하고 옵션을 작성

=>클래스 이름의 첫글자는 대문자로 시작하도록 권장

//main 메소드가 없는 클래스 - 실행할 수 없는 보조적인 역할을 수행하는 클래스

public class SampleClass {

 

}

 

2)실행 클래스를 만들고 위에서 만든 SampleClass의 인스턴스 만들기

           public static void main(String[] args) {

                       //SampleClass의 인스턴스 만들기

                       //new SampleClass();가 인스턴스를 만드는데

                       //위의 구문은 수행을 하고 인스턴스의 참조를 리턴합니다.

                       //이 인스턴스를 재사용할려면 인스턴스의 참조를 동일한 자료형의 변수에 대입을 해야 합니다.

                       SampleClass  obj = new SampleClass();//모든 언어가 같다.

 

           }

 

**속성 또는 변수

1.변수의 종류

=>동일한 영역에서 동일한 이름으로 변수를 2번 생성할 수 없습니다.

 

1)Local Variable(지역 변수)

=>메소드 안에서 만들어져서 메소드 안에서만 사용 가능한 변수

=>메소드 안에 존재하는 다른 블록 안에서 만들어지면 그 블록 안에서만 사용이 가능합니다.

=>동일한 영역에서 동일한 이름으로 변수를 2번 생성할 수 없습니다.

=>접근 지정자를 사용하지 않습니다.

 

=>생성

자료형 변수이름;

자료형 변수이름 = ;

 

=>처음에 값을 대입하지 않으면 변수는 생성되지 않습니다.

지역변수는 처음 값을 대입할 때 생성됩니다.

 

2) Menber Variabl(멤버 변수)

=>클래스 내부에서 메소드 바깥에 선언된 변수로 static.이라는 키워드가 없이 만들어진 변수

=>클래스로부터 만들어지는 각 인스턴스가 자신의 특성을 표현하기 위해서 별도로 소유

=>생성할 때는 접근지정자와 함께 생성

=>변수를 만들 때 값을 대입하지 않아도 기본값으로 초기화가 됩니다.

=>false, 0, 0.0, null등으로 초기화

접근지정자 자료형 변수명으로 선언

 

3)static Variable(클래스 변수)

=>클래스 내부에서 메소드 바깥에 선언된 변수로 static.이라는 키워드와 함께 만들어진 변수

=>동일한 클래스로부터 생성된 모든 인스턴스가 공유하기 위한 변수

=>이 변수는 1개만 생성되고 소멸되지 않습니다.

=>생성할 때는 접근지정자와 함께 생성

=>변수를 만들 때 값을 대입하지 않아도 기본값으로 초기화가 됩니다.

=>false, 0, 0.0, null등으로 초기화

static 접근지정자 자료형 변수명으로 선언

 

2.final

=>변수 앞에 붙이면 변수의 값을 변경하지 못하도록 read only를 만들어주는 키워드

 

3.멤버 메소드나 멤버 변수의 접근 지정자

1)private :클래스 내부의 메소드에서만 사용할 수 있도록 해주는 지정자 ->내안에서만

2)default(package- 생략):동일한 패키지 내에서는 public이고 다른 패키지에서는 private

3)protected: default 에 상속받은 클래스에서도 사용할 수 있도록 해주는 지정자

4)public클래스 냅의 메소드에서 사용 가능하고 클래스 외부에서 인스턴스나 클래스를 이용해서 접근가능 ->밖에서도

 

4. static 변수는 클래스와 인스턴스 모두 접근 가능하지만 member variable은 인스턴스만 접근 가능

=>static은 공통된 내용을 저장할 때 사용하고 menmber variable은 각각의 특징을 저장할 때 사용

 

5.실습

1)final이 붙이면 변수의 값을 수정할 수 없습니다.

=>MainClass main 메소드에 final 변수를 선언

                       //이럴 경우 에러가 난다.

                       //final int x;

                       //x = 10;

                      

                       //final 변수는 생성과 동시에 값을 할당

                       //값을 변경할 수 없기 때문입니다.

                       //final 변수의 이름은 모두 대문자로 만드는 것이 관ㄱ례

                       //final int x = 10;

                       //x =20; //이문장은 에러

                      

                       final int TEN = 10;

 

=>fianl은 클래스 안에서 옵션을 만들 때 주로 사용

일반 정수 데이터를 의미있는 이름을 부여해서 이해하기 쉽게 할 목적

 

2) SampleClass에 변수를 선언

//main 메소드가 없는 클래스 - 실행할 수 없는 보조적인 역할을 수행하는 클래스

public class SampleClass {

          

          

           //static변수 - 클래스로 접근 가능하고 인스턴스로도 접근 가능

           //모든 인스턴스가 공유

           static int share = 1;

          

           //인스턴스 변수(멤버 변수)- 인스턴스만 접근이 가능하고 각 인스턴스가 별도로 소유

           String name;

          

}

 

3)MainClass 클래스의 main 메소드에서 static이 붙은 것과 그렇지 않은 변수의 차이를 알아보는 코드 작성                      //SampleClass의 인스턴스를 2개 생성

                       SampleClass ob1 = new SampleClass();

                       SampleClass ob2 = new SampleClass();

                      

                       //인스턴스 변수에 값 대입

                       ob1.name = "첫번째 인스턴스";

                       ob2.name = "두번째 인스턴스";

                      

                       //static이 붙지 않은 멤버는 클래스는 호출 할 수 없습니다.

                       //SampleClass.name 은 안됨 항상 인스턴스로 호출해야 한다.

                      

                       //인스턴스 변수의 값 출력 - 인스턴스 변수는 각각 소유하기 때문에 서로 다른 값 출력

                       System.out.println(ob1.name);

                       System.out.println(ob2.name);

                      

                       //static변수에 값 대입

                       SampleClass.share = 200;

                       //static변수는 하나만 만들어서 공유

                       //출력을 해보면 동일한 값을 출력

                       System.out.println(ob1.share);

                       System.out.println(ob2.share);

                       System.out.println(SampleClass.share);

 

4)privatepublic차이

=>클래스 안에서 private으로 만들어지면 클래스 안에서만 사용가능

=>public으로 만들어지면 클래스 외부에서 클래스 이름이나 인스턴스를 통해서 사용이 가능

=>클래스 안에서 사용을 할 때는 이름만 호출하면 됩니다.

 

SampleClass에서 share변수 선언문 앞에  private을 추가하고 저장을 하면 main 메소드가 에러가 발생합니다.

이 에러는 없다라고 에러 메시지가 뜨지 앟고 존재하지만 보이지 않는다는 에러 메시지가 출력

 

//main 메소드가 없는 클래스 - 실행할 수 없는 보조적인 역할을 수행하는 클래스

public class SampleClass {

          

          

           //static변수 - 클래스로 접근 가능하고 인스턴스로도 접근 가능

           //모든 인스턴스가 공유

           private static int share = 1;

          

           //인스턴스 변수(멤버 변수)- 인스턴스만 접근이 가능하고 각 인스턴스가 별도로 소유

           String name;

          

}

 

private 하면 바깥쪽에는 사용이 불가하다.

 

5).static멤버를 인스턴스를 이용해서 접근하면 경고가 발생

=>static 멤버는 클래스 이름을 통해서 접근하는 것을 권장

 

\

 

메모리는 3개 영역이다.

          

 

 

 

MainClass -> public static void main(String[] args){ 수행:

SampleClass ob1 = new SampleClass();

 

 

 

static

Heap

stack                                                 

args

 

 

table

   

 

 

 

 

SampleClass ob1 = new SampleClass();이 명령에서

1). SampleClass table에서 확인  

SampleClass 이름 있는지 확인 table code에서 존재하는 지 확인

table code로 존재하는 것만 할당

static에 있는 것은 할당 안한다.

2).table없으면 static 확인후 등록

 

 

 

 

 

인스턴스는 자신이 할당 받은 메모리 공간에서 데이터를 찾지 못하면 클래스 영역에서 찾는다.

static 공간 주는 것이고 static없는 것은 코드 주고 공간만 준다.

3)ob1

 

                                          

 

4)new SampleClass()

 

==================>SampleClass ob2 = new SampleClass();

 

SampleClass확인

 

 

ob1.name ="첫번째"

ob1.name ="두번째"

SampleClass.share = 100;

 

 

 

 

 

 

 

SampleClass.name ->이렇게 하면 오류 난다. 없다. 안보이는 것이 아니라 없다.

 

 

 

 

ob1.share = 200 이것은 가능하다.

 

 

 

static 은 한번 만들면 그냥 나두고 static 아니면 계속 따로 만든다.

인스턴스는 자기한테 없으면 table에 가서 찾고 static에 가서 바꾼다.

static인스턴스나 class가나 결과는 같다.

메소드 끝나면 없어진다. stack없어지고  heap위 없어지고 하지만 없어지는 것이 아니라 사용불가하게 하고 사용가능으로 바꿀 수 있다. 할당 할수 도 있다.

1101->지우려면 0000 덮어씌우기

0에서 삭제된 데이터를 찾을 수 있다. 할당할 수 있어 자꾸 쓰고 삭제를 하면 복구가 힘들다.

 

 

 

 

 

 

 

 

 

 

 

 

 

java는 가르키는 겂이 없으면 소멸

java는 항상 누가 가르키는지

python a= 10 b =a  reatail cont

a = None -> retail count 가 하나씩 깍는다.

pythonretail count

프로그램으로 하는 것은 java가 빠르는데 데이터베이스는 썼다 삭제했다 해서 좀 느리다.

 

 

뱅뱅 돌아왔다. class 참조하면 되는데

 

 

6.static initializer

=>클래스 안에

static{

           내용

}

=>을 작성하면 클래스가 메모리에 로드될 때 1번만{}안의 내용을 수행

=>여기에는 static변수는 사용할 수 있지만 member(instance)변수는 사용할 수 없음

=>주로 static변수의 초기화에 이용

=>여러 번 작성하면 작성 한 순서대로 실행

 

실습)

SampleClassstatic초기화 블럭을 작성하고 MainClass실행

=>가장 먼저 내용이 출력

           //static 초기화 블럭

           static {

                       System.out.println("클래스가 처음 호출될 때 1번만 수행");

           }

 

 

**Method

=>전달받은 데이터를 이용해서 처리를 수행한 후 결과를 돌려주는 작은 프로그램

=>Function이라고도 하는데 보통은 Function 은 아무곳에서나 호출할 수 있는 것을 의미하고 Method는 클래스나 인스턴스를 통해서만 호출할 수 있는 것을 의미합니다.

 

1.메소드의 생성 - 선언

[접근지정자] +[특성]+리턴타입 +메소드이름(매개변수 자료형 매개변수이름,........){

           메소드 내용;

           return 데이터;

}

 

1)    접근 지정자

private :클래스 내부에서만 호출해서 사용

default(package) :패키지(디렉토리)내에서는 public 밖에서는 private

protected :default에 상속받은 클래스에서도 사용이 가능

public 클래스 외부에서 클래스나 인스턴스를 톻애서 사용 가능

 

2)특성

abstract(추상) -내용이 없는 메소드

final(중단) - 재정의 할 수  없는 메소드

static- 클래스 메소드

sysnchronized- 동기화 메소드: 작업 수행 도중에는 다른 스레드를 수행할 수 없도록 하는 메소드

native - C언어에서 만든 운영체제에게 직접 전달해서 실행하도록 해주는 메소드

 

자바 <-> jvm(java Virtual Machine) <->운영체제

자바 만을 가지고 운영체제를 핸들링하는 프로그램을 만들 수 없어서 C언어로 만든 메소드를 호출해서 운영제제를 핸들링합니다.

 

pythonc언어로 많이 만들어져 있다. numpy

 

3).return type

=>메소드는 호출되면 자신의 작업을 수행하고 호출한 곳으로 돌아오는데 이것을 return이라고 합니다.

=>이 때 데이터를 가지고 return할 수 있는데 이 데이터의 자료형이 return type입니다.

=>데이터를 가지고 오지 않는 경우에는 void라고 기재합니다.

 

4).argument(매개변수)

=>함수를 호출할 때 넘겨주는 데이터

=>자바에서는 반드시 자료형과 함께 기재해야 하고 없는 경우에는 생략이 가능

 

2.메소드 호출

=>자신의 클래스 내부에서는 메소드이름(매개변수 나열)의 형태로 호출 가능

=>클래스 외부에서는 클래스이름.메소드이름(매개변수 나열)또는 클래스이름 대신에 인스턴스를 기재

 

 

3.메소드 원형

=>메소드의 내용은 생략하고 결과형 리턴 타입과 메소드이름(매개변수)만을 의미

 

4.메소드 사용 이유

1)자주 사용하는 코드를 하나의 이름으로 묶어서 유지 보수를 관리하게 하기 위해서

 

2)프로그램을 적절한 크기로 모듈화하기 위해서

프로그램을 적절한 크기로 분할하지 않으면 읽기가 어려워지고 메모리 부족 현상이 벌어질 수 있습니다.

프로그래밍언어나 IDE에 따라서 Stack의 크기라 정해진 경우가 있는데 이 Stack이 사이즈보다 더 큰 메모리를 사용할려고 하는 경우  Stack Overflow라는 예외가 발생합니다.

int ar[1000000];//메모리 문제 생긴다.

 

package ->directory

 

5.실습

1).hELLO JAVA3번 출력하는 메소드를 소유한 클래스

public class MethodClass {

          

           //매개변수가 없고 리턴 타입이 void메소드

           public void disp() {

                       //메소드의 내용

                       for(int i = 0; i < 3; i++) {

                                  System.out.println("Hello Java");

                       }

           }

}

 

 

2).MAIN메소드를 소유한 Main클래스에서 위의 메소드 출력

           public static void main(String[] args) {

                       //일정한 패턴을 갖는 연속된 문장 -> 반복문으로 변경 가능

                       //System.out.println("Hello Java");

                       //System.out.println("Hello Java");

                       //System.out.println("Hello Java");

                       /*

                        * for(int i = 0; i < 3; i++) { System.out.println("Hello Java"); }

                        */

          

                       //아래 것은 연속적이지 않고

                       /*

                        * System.out.println("Hello Python");

                        *

                        * for(int i = 0; i < 3; i++) { System.out.println("Hello Java"); }

                        */

                       //MethodClass 의 인트턴스를 생성

                       MethodClass obj = new MethodClass();

                       //메소드 호출 -수행할 내용을 변경하고자 하면 메소드의 내용만 변경

                       obj.disp();

                      

                       System.out.println("Hello Python");

                       //메소드 호출

                       obj.disp();

           }

6.Argument(매개변수)

=>메소드를 호출할 때 넘겨주는 데이터

=>메소드를 실행하는데 필요한 데이터

=>없을 수도 있고 여러 개 일 수 있습니다.

=>매개변수가 있으면 함수의 활용범위가 높아지게 됩니다.

 

1)MethodClass에 매개변수가 있는 메소드를 추가

// 매개변수가 정수 1개이고 리턴 타입이 void 메소드

// 이 메소드는 호출할려면 반드시 정수 1개를 넘겨주어야 합니다.

 

           public void print(int n) {

                       // 메소드의 내용

                       for (int i = 0; i < n; i = i + 1) {

                                  System.out.println("Hello Java");

                       }

           }

2)main 메소드에서 호출

//매개변수가 있는 메소드 호출

System.out.println("========================");

obj.print(5);

System.out.println("========================");

obj.print(2);

 

3)메소드를 만들 때 매개변수의 개수 제한은 없지만 매개변수의 개수가 많으면 함수를 호출할 때 코드가 길어지고 매개변수의 순서대로 데이터를 대입하는 것이 어렵습니다.

이 문제를 해결하기 위해서 매개변수가 여러 개 일 때는 별도의 클래스를 만들거나 Map 을 이용하는 것을 권장합니다.

 

Eclipse에서는 적용이 안되지만 Intelli J Android Studio에서는 매개변수 앞에 이름을 붙이는 구조를 지원을 합니다.

 

4)Method Overloading(메소드 중복 정의)

=>대부분의 객체 지향 언어에서는 하나의 클래스에 동일한 이름의 메소드를 여러 개 만드는 것을 지원

=>이 때 매개변수의 개수나 매개변수의 자료형은 달라야 합니다.

=>하나의 클래스에 메소드의 이름은 같고 매개변수의 개수나 자료형이 다른 경우를 메소드 오버로딩이라고 합니다.

=>동일한 알고리즘을 사용하는데 매개변수의 개수나 자료형이 다른 이유때문에 메소드 이름을 다르게 하면 메소드 이름을 기억하기도 어렵고 메소드 이름이 너무 많이 필요합니다. - C언어

 

=>정수 2개 덧셈하는 메소드: add(int, int)

=>실수 2개 덧셈하는 메소드: add(double, double)

=>객체 지향 언어 면접 보러 가면 반드시 기억

 

5)Method Overloading 구현을 위해서 MethodClass 수정

public class MethodClass {

           // 매개변수가 없고 리턴 타입이 void 메소드

           public void disp() {

                       // 메소드의 내용

                       for (int i = 0; i < 3; i = i + 1) {

                                  System.out.println("Hello Java");

                       }

           }

 

           // 매개변수가 정수 1개이고 리턴 타입이 void 메소드

           // 이 메소드는 호출할려면 반드시 정수 1개를 넘겨주어야 합니다.

           // 동일한 이름의 메소드가 하나의 클래스에 존재하는 경우를 Method Overloading 이라고 합니다.

           public void disp(int n) {

                       // 메소드의 내용

                       for (int i = 0; i < n; i = i + 1) {

                                  System.out.println("Hello Java");

                       }

           }

}

 

6)main 메소드에서 print 호출하는 부분을 disp로 수정

 

7.매개변수 전달 방법

=>value type(scala, 기본형): 변수가 데이터 자체를 의미

int a = 10;

int b = a + 5;

 

=>reference type(vector, 참조형): 변수가 데이터 전체의 시작 위치를 가리키는 참조

int [] ar = {100, 300, 200};

ar 은 데이터가 아니고 데이터가 저장된 곳의 참조

데이터를 찾아갈려면 ar[인덱스]를 해주어야 합니다.

 

1)call by value

=>매개변수의 자료형이 value 형인 경우로 메소드가 전달되는 데이터를 변경할 수 없습니다.

 

2)call by reference

=>매개변수의 자료형이 reference 형인 경우로 메소드가 전달되는 데이터를 변경할 수 도 있습니다.

 

3)실습

=>MethodClass 클래스에 2개의 메소드를 생성

하나는 정수를 받아서 1증가시키고 출력하는 메소드

다른 하나는 정수 배열을 받아서 첫번째 데이터를 1감소시키고 출력하는 메소드

 

           //정수 1개를 매개변수로 받아서 1증가시키고 출력하는 메소드 : Call By Value

           public void inc(int n) {

                       n = n + 1;

                       System.out.println("n:" + n);

           }

          

           //배열 1개를 매개변수로 받아서 첫번째 데이터를 1감소시키고 출력하는 메소드 : Call By Reference

           public void dec(int [] ar) {

                       ar[0] = ar[0] - 1;

                       System.out.println("ar[0]:" + ar[0]);

           }

 

=>main 메소드에 확인하기 위한 코드를 작성하고 실행

int x = 100;

                       int [] br = {100,200,300};

                       obj.inc(x);

                       //x의 값은 직접 호출해서 변경하지 않는 이상 절대로 변경되지 않음

                       System.out.println("x:" + x);

                      

                       obj.dec(br);

                       //참조형의 경우 메소드의 매개변수로 대입되면 데이터가 변경되어 있을 수도 있음

                       System.out.println("br[0]:" + br[0]);

 

4)참조형 데이터를 받아서 작업을 하는 메소드 중에서 return을 하지 않는다면 이 메소드는 매개변수로 받은 데이터를 변경을 할 가능성이 높습니다.

단 예외적인 메소드는 화면에 무엇인가를 출력하는 메소드들입니다.

print 나 그래프 등을 그리는 메소드 등

 

8.varargs

=>매개변수의 개수를 지정하지 않고 대입 가능하도록 한 방식

=>java 1.5에서부터 지원

=>매개변수를 만들 때 (자료형 ... 매개변수이름) 의 형태로 작성하면 자료형의 데이터를 몇 개를 대입하던지 메소드 내에서는 매개변수이름의 배열로 취급

=>파이썬에서는 *이름 의 형태로 만들어져 있는 것과 동일

=>이 방식을 취하는 대표적인 메소드는 printf 메소드 입니다.

 

           //정수 데이터가 몇 개 가 오던지 합계를 구해서 출력해주는 메소드

           public void sum(int ... ar) {

                       //... 이름을 이용하면 내부에서는 배열로 취급

                       int sum = 0;

                       //배열의 모든 데이터를 순서대로 접근해서 sum에 추가

                       for(int data : ar) {

                                  sum = sum + data;

                       }

                       System.out.println("합계:" + sum);

           }

 

=>main 메소드에서 위의 메소드 호출

           obj.sum(10, 30);

           obj.sum(20, 30, 10, 50);

 

9.return

=>return은 메소드 수행 중에 메소드를 호출한 곳으로 제어권을 이동시키는 명령어

=>return을 할 때 1개의 데이터를 호출한 곳으로 가져 갈 수 있습니다.

이렇게 데이터를 가져갈 때는 메소드 이름앞에 가져갈 데이터의 자료형을 기재해야 합니다.

=>return 할 데이터가 없으면 void 라고 기재해야 합니다.

=>return 이후에 작성한 코드는 수행될 수 없기 때문에 return 이후에 실행되는 코드는 작성하면 안됩니다.

=>return 이 없는 메소드는 메소드의 결과를 가지고 다음 작업을 이어서 할 수 없지만 return이 있으면 그 결과를 가지고 다음 작업을 이어서 수행할 수 있습니다.

=>되도록이면 메소드를 만들 때 set 하는 메소드가 아니면 return을 하는 것이 좋습니다.

 

1)MethodClass에 리턴을 하는 메소드를 생성

           //2개의 정수를 매개변수로 받아서 더한 후 결과를 리턴하는 메소드

           //메소드 이름 앞의 자료형과 return 하는 데이터의 자료형은 일치해야 합니다.

           public int addReturn(int a, int b) {

                       return (a+b);

           }

 

2)main 메소드에서 위의 메소드 사용

//return 이 있는 메소드

                       //메소드의 수행 결과를 r에 저장

                       int r = obj.addReturn(200, 300);

                       System.out.println("결과:" + r);

                       //이전 작업 결과를 가지고 다음 작업을 수행

                       r = obj.addReturn(r, 700);

                       System.out.println("결과:" + r);

                      

                       //return 값이 메소드는 다른 메소드의 매개변수가 될 수 있습니다.

                       r = obj.addReturn(300, obj.addReturn(300, 700));

                       System.out.println("결과:" + r);

 

10.static 메소드

=>메소드의 자료형 앞에 static을 추가한 메소드

=>static이 붙은 메소드는 클래스가 호출해도 되고 인스턴스가 호출해도 됩니다.

static이 없는 메소드는 반드시 인스턴스가 호출해야 합니다.

=>static 메소드는 인스턴스 변수 사용이 안됩니다.

=>static 변수와 자신의 메소드 안에서 만든 지역 변수만 사용이 가능

=>클래스 이름으로 호출할 때 인스턴스가 하나도 없을 수 있고 static 메소드에는 this가 없습니다.

=>이 메소드는 인스턴스 변수와 무관한 메소드를 인스턴스 생성없이 호출하기 위한 목적이나 디자인 패턴을 적용해서 인스턴스를 생성하는 용도로 만듭니다.

=>static 메소드는 특별한 경우가 아니면 클래스로 호출하는 것을 권장합니다.

 

11.this

=>인스턴스 메소드의 숨겨진 매개변수

=>인스턴스 메소드의 첫번째 매개변수로 우리가 생성하지 않아도 자동으로 생성됩니다.

=>인스턴스를 이용해서 메소드를 호출할 때 인스턴스의 참조가 자동으로 대입됩니다.

=>인스턴스 메소드 안에서 지역변수가 아닌 변수나 메소드를 호출할 때 앞에 자동으로 대입됩니다.

=>실제 사용은 인스턴스 메소드 안에서 지역변수와 인스턴스 변수의 이름이 같을 때 인스턴스 변수를 명시하기 위해서 사용을 합니다.

 

 

 

6.Argument(매개변수)

=>메소드를 호출할 때 넘겨주는 데이터

=>메소드를 실행하는데 필요한 데이터

=>없을 수도 있고 여러 개 일 수 있습니다.

합계를 구하려면 데이터가 있어야 한다.

python은 자료형은 안쓰고 java는 자료형을 쓰야 한다.

=>매개변수가 있으면 함수의 활용범위가 높아지게 된다.

 

일을 확장시킬수 있고 메소드 이름을 다르게 할 수 도 있다.

 

1)MethodClass에 매개변수가 있는 메소드를 추가

           //매개변수가 정수 1개이고 리턴 타입이 void메소드

           // 이 메소드는 호출할려면 반드시 정수 1개를 넘겨주어야 합니다.

           public void print(int n) {

                       //메소드의 내용

                       for(int i = 0; i < n; i++) {

                                  System.out.println("Hello Java");

                       }

           }

 

 

iterable

 

 

2)main메소드에서 호출

                       System.out.println("==================");

                       //매개변수가 있는 메소드 호출

                       obj.print(5);

                       System.out.println("==================");

                       //python은 자료형을 안주도 된다. 잘 모르면 쓰기가 곤란한다.

                       obj.print(2);

 

3)메소드를 만들 때 매개변수의 개수 제한은 없지만 매개변수의 개수가 많으면 함수를 호출할 때 코드가 길어지고 매개변수의 순서대로 데이터를 대입하는 것이 어렵습니다.

이 문제를 해결하기 위해서 매개변수가 여러 개 일 때는 별도의 클래스를 만들거나 Map을 이용하는 것을 권장합니다.

 

Eclipse에서는 적용이 안되지만 Intelli Androiod Strudio에서는 매개변수 앞에 이름을 붙이는 구조를 지원합니다.

python 순서에 상관없이

(a= 10)

 

4)Method Overloading(메소드 중복 정의)

=>대부분의 객체 지향 언어에서는 하나의 클래스에 동일한 이름의 메소드를 여러 개 만드는 것을 지원

=> 이 때 매개변수의 개수나 매개변수의 자료형은 달라야 합니다.

=>하나의 클래스에 메소드의 이름은 같고 매개변수의 개수나 자료형이 다른 경우를 메소드 오버로딩이라고 합니다.

=>동일한 알고리즘을 사용하는데 매개변수의 개수나 자료형이 다른 이유때문에 메소드 이름을 다르게 하면 메소드 이름을 기억하기도 어렵고 메소드 이름이 너무 많이 필요합니다.-C언어

 

=>정수 2개 덧셈하는 메소드:addInteger =>add(int , int)

=>실수 2개 덧셈하는 메소드:addDouble =>add(double, double)

=>객체 지향 언어 면접 보러 가면 반드시 기억

=>Method별로 같은 자료형이면 같은 이름으로 써도 된다.

=> 동일한 이름의 Method가 하나의 Class에 존재하는 경우 Method Overloading

 

          

           //매개변수가 없고 리턴 타입이 void메소드

           public void disp() {

                       //메소드의 내용

                       for(int i = 0; i < 3; i++) {

                                  System.out.println("Hello Java");

                       }

           }

          

           //매개변수가 정수 1개이고 리턴 타입이 void메소드

           // 이 메소드는 호출할려면 반드시 정수 1개를 넘겨주어야 합니다.

           // 동일한 이름의 메소드가 하나의 클래스에 존재한느 경우를 Method Overloding이라고 합ㄴ디ㅏ.

           public void disp(int n) {

                       //메소드의 내용

                       for(int i = 0; i < n; i++) {

                                  System.out.println("Hello Java");

                       }

           }

 

6.main메소드에서 print호출하는 부분을 disp로 수정

                       obj.disp(5);

 

 

7매개변수 전달 방법

=>value type(scala, 기본형):변수가 데이터 자체를 으미

 

int a= 10;

int b = a+5;

 

=>reference type(vector, 참조형):변수가 데이터 전체의 시작 위치를 가리키는 참조

int[] ar = {100,300,200}

ar은 데이터가 아니고 데이터가 저장된 곳의 참조

데이터를 찾아갈려면 ar[인덱스] 를 해주어야 합니다.

 

1)call by value=>단가가 높다.

=>매개변수의 자료형이 value형인 경우로 메소드가 전달되는 데이터를 변경할 수 없습니다.

 

2)call by reference

=>매개변수의 자료형의 reference형인 경우로 메소드가 전달되는 데이터를 변경할 수 도 있습니다.

 

 

 

int a = 10;

//value type => java 8boolean,byte,short, char,int,long,float,double

//python bool int str .. =>4

int[] ar = {100,300,200} //reference type c에는 point

a= 10;

class Method{

           public void int(){

                       x = x+1;

                       System.out.println("x:" +x);

}

public void dec(int[] br){

           br[0] = br[0]-1;

}

}

 

MethodClass obj = new MethodClass();

obj.inc(a);

System.out.println("a:"+a); //10  call by value 매개변수 못 바꾼다.

// call by value절대 안 바꾼다.

 

obj.dec(ar); //참조형 바꿀 가능성이 있다. 무조건 바꿘다. return이 없으면 참조형은 무조건 바꾼다.

System.out.println("ar" + ar[0] );

->None(뭐하는 것인지 확인해야 한다.) 과 공백 null  다르다.

None  return하면 무조건 바꾼다. 참조형은 실제 데이터를 준다.

 

 

call by value책의 복사본을 만들어서 하는 것이다.

call by reference 별로 추천하지 않는다. 책 원본을 빌리는 것이다.  내용이 뭔지 모르기 때문이다.

 

3)실습

=>MethodClass클래스에 2개의 메소드를 생성

하나는 정수를 받아서 1증가시키고 출력하는 메소드

다른 하나는 정수 배열을 받아서 첫버째 데이터를 1감소시키고 출력하는 메소드

           //정수 1개를 매개변수로 받아서 1증가시키고 출력하는 메소드:call by Value

           public void inc(int n) {

                       n = n+1;

                       System.out.println("n:" +n);

           }

          

           //배열 1개를 매개변수로 받아서 첫번째 데이터를 1감소시키고 출력하는 메소드:Call by Reference

           public void dec(int[] ar) {

                       ar[0] = ar[0]-1;

                       System.out.println("ar[0]:" +ar[0]);

           }

 

=>Main메소드에 확인하기 위한 코드를 작성하고 실행

                       int x = 100;

                       int[] br = {100,200,300};

                       obj.inc(x);

                       // x의 값은 직접 호출해서 변경하지 않는 이상 절대로 변경되지 않음

                       System.out.println("x:"+x);

                      

                       obj.dec(br);

                       //참조형의 경우 메소드의 매개변수로 대입되면 데이터가 변경되어 있을 수도 있음

                       System.out.println("brx[0]:"+br[0]);

 

4)참조형 데이터를 받아서 작업을 하는 메소드 중에서 return을 하지 않는다면 이 메소드는 매개변수로 받은 데이터를 변경을 할 가능성이 높습니다.

단 예외적인 메소드는 화면에 무엇인가를 출력하는 메소드들입니다.

print나 그래프 등을 그리는 메소드 등

 

 

8.varargs

=>매개변수의 개수를 지정하지 않고 대입 가능하도록 한 방식

=>java 1.5에서 부터 지원

=>매개변수를 만들 때 (자료형 ...매개변수이름)의 형태로 작성하면 자료형의 데이터를 몇 개를 대입하던지 메소드 내에서는 매개변수이름의 배열로 취급

=>파이썬에서는 *이름 의 형태로 만들어져 있는 것과 동일

=>이 방식을 취하는 대표적인 메소드는 printf메소드 입니다.

 

           // 정수 데이터가 몇개 가 오던지 합계를 구해서 출력해주는 메소드

           public void sum(int ...ar) {

                       ///... 이름을 이용하면 내부에서는 배열로 취급

                       int sum = 0;

                       //배열의 모든 데이터를 순서대로 접근해서 sum에 추가

                       for(int data: ar) {

                                  sum = sum+data;

                       }

                       System.out.println("합계:"+sum);

           }

 

=>main메소드에서 위의 메소드 호출

                       obj.sum(10,30);

                       obj.sum(20,30,10,50);

 

 

 

9.return

=>return은 메소드 수행 중에 메소드를 호출한 곳으로 제어권을 이동시키는 명령어

=>return을 할 때 1개의 데이터를 호출한 곳으로 가져 갈 수 있습니다.

이렇게 데이터를 가져갈 때는 메소드 이름앞에 가져갈 데이터의 자료형을 기재해야 합니다.

=>return할 데잍가 없으면 void라고 기재해야 합니다.

=>return이후에 작성한 코드는 수행될 수 없기 때문에 return 이후에 실행되는 코드는 작성하면 안됩니다.

=>return 이 없는 메소드는 메소드의 결과를 가지고 다음 작업을 이어서 할 수 없지만 return이 있으면 그 결과를 가지고 다음 작업을 이어서 수행할 수 있습니다.

=>되도록이면 메소드를 만들 때 set하는 메소드가 아니면 return을 하는 것이 좋습니다.

 

return이 없을 경우

MethodClass

           // 2개의 정수를 매개변수로 받아서 더한 후 결과를 출력하는 메소드

           public void addDispaly(int a, int b) {

                       System.out.println("a+b:"+(a+b));

           }

          

Main

                                  obj.addDispaly(100, 200);//결과는 나오지만 300가지고 어떻게 처리 할 수가 없다.

 

결과 => a+b:300

1)MethodClass에 리턴을 하는 메소드를 생성

           // 2개의 정수를 매개변수로 받아서 더한 후 결과를 리턴하는 메소드

           // 메소드 이름 앞의 자료형과  return 하는 데이터의 자료형은 일치해야 합니다.

           public int addReturn(int a, int b) {

                       return (a+b);

           }

 

2)main메소드에서 위의 메소드 사용

                      

                       //return이 있는 메소드

                       //메소드의 수행 결과를  r에 저장

                       int r = obj.addReturn(200,300);

                       System.out.println("결과:" +r);

                      //이전 작업 결과를 가지고 다음 작업을 수행

                       r = obj.addReturn(r, 700);

                       System.out.println("결과:" +r);

                      

                       //return 값이 메소드는 다른 메소드의 매개변수가 될 수 있습니다.

                       r = obj.addReturn(300, obj.addReturn(300, 700));

                       System.out.println("결과:" +r);

 

10.static메소드

=>메소드의 자료형 앞에 static을 추가한 메소드

=>static이 붙은 메소드는 클래스가 호출해도 되고 인스턴스가 호출해도 됩니다.

static이 없는 메소드는 반드시 인스턴스가 호출해야 합니다.

=>static 메소드는 인스턴스 변수 사용이 안됩니다.

=>static변수와 자신의 메소드 안에서 만든 지역 변수만 사용이 가능

=>클래스 이름으로 호출할 때 인스턴스가 하나도 없을 수 있고 static메소드에는 this가 없습니다.

=>이 메소드는 인스턴스 변수와 무관한 메소드를 인스턴스 생성없이 호출하기 위한 목적이나 디자인 패턴을 적용해서 인스턴스를 생성하는 용도로 만듭니다.

=>static메소드는 특별한 경우가 아니면 클래스로 호출하는 것을 권장합니다.

 

 

11.this

=>인스턴스 메소드의 숨겨진 매개변수

=>인스턴스 메소드의 첫번째 매개변수로 우리가 생성하지 않아도 자동으로 생성됩니다.

=>인스턴스를 이용해서 메소드를 호출할 때 인스턴스의 참조가 자동으로 대입됩니다.

=>인스턴스 메소드 안에서 지역변수가 아닌 변수나 메소드를 호출할 때 앞에 자동으로 대입됩니다.

=>실제 사용은 인스턴스 메소드 안에서 지역변수와 인스턴스 변수의 이름이 같을 때 인스턴스 변수를 명시하기 위해서 사용을 합니다.

python에서 self 이름이 안 정해져있지만 javathis로 이름이 되여있다.

self는 안줘도 된다. 클래스 통해서 unbonud호출 할때는 class에 줘야한다.

bound에서는 필요 없다.

li = [10,20]

li.sort() =>bound호출

list.sort(li) =>unbound호출

python

bound unbound 방식

메서드 호출에는 bound unbound 방식이 있습니다.

두 방식은 객체를 참조한다는 점에서 같지만메서드를 정의할 때 작성한 self 객체와 자동으로 binding 되어 있느냐의 차이입니다.

따라서 메서드를 호출할 때 인자로 객체를 넣어줘야 하면 unbound 방식이고, 그렇지 않으면 bound 방식입니다.

 

여기서 self는 객체 자기 자신을 의미하는 키워드이며, 메서드를 정의할 때 첫 번째 파라미터에 위치합니다.

관례적으로 sefl라는 이름을 사용하며, 다른 이름을 작성하는 것도 가능하지만 관례를 따르는 것이 좋습니다.

unbound 방식에서는 첫 번째 인자로 Point 객체를 전달했지만, bound 방식에서는 그러지 않은 것을 확인할 수 있습니다.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

static 있으면 따로 하는 것 아니면 instance멤버

instance method는 근본적으로 인스턴스 소유가 아니다.

클래스에 소유하고 있다가 호출하면 경개해서 실행

T ob = new T();

ob.setN(100); =>ob.setN(ob,100);

System.out.println(ob.n); //100

메소드는 근본적으로 인스턴스 소우 실행할 수 없다.

T ->setN(int x){

           n = x;

    }

T ob = new T();

                      

class T

n 0

 

ob.n

1)    class는 누구냐?

2)    나 인스턴스 변수 가지고 만들어진다.

class

instance

T -> setN(T this, int x){

           n = x;

}

T this =>ob

int x => 100

n = 100(x);

n이기 100이지 ob.n이 아니다.

 

python self

java this

직접 대입할 필요가 없다.

 

변수

지역변수(범위가 재일 작다.)

 

인스턴스 변수(범위가 조금 크다.)   static 변수 (비교 할 수 없지만.)

=>scope의 법칙 변수는 특별한 지시자가 없으면 가까운 곳에서 만든 것을 우선한다.

this super

class T{

           public int n= 100; //인스턴스 변수

           public void setN(){ //

                       n = 10; //지역변수

                       System.out.println(n); //10을 찍는다. 무조건 가까운 것

}

System.out.println(n); //100

method 안에서 찾는 것이 아니라 메소드 외부에서 부터 찾는다.

}

보통 this가 나오면 이름명명이 보통 잘 못 되여있기 때문에 custmizing 할때 확인하는게 좋다.

 

 

 

 

 

 

 

 

 

 

재일 좋은 방법은 똑같은 이름 만들지 않는 것이다.

지역변수: _

인스턴스 변수 :m_

static변수 : s_

위의 방식으로 하면 절대 똑같은 것 맏를 가능성이 없다.

 

c++ 요즘 은 쓰는것으ㄴ 없다.

visual c++

 

pythone은 이것들을 피해려고 __ __이런것을 만들었다.

this사용하는 것은 밖에 있는 것을 사용하려고 하는 것이다.

 

 

반응형

'Study > Java' 카테고리의 다른 글

java-6  (0) 2020.09.26
java-5  (0) 2020.09.24
java-3  (0) 2020.09.20
java-2  (0) 2020.09.20
java-1  (0) 2020.09.19

+ Recent posts