반응형

**property getter & setter

1.접근자 메소드

=>인스턴스 변수에 접근하기 위한 메소드

=>객체 지향 프로그래밍에서는 인스턴스 변수에 인스턴스(객체)가 직접 접근하는 것을 권장하지 않습니다.

인스턴스가 인스턴스 변수에 직접 접근하게 되면 예기치 않은 상황이 발생할 수 있기 때문입니다.

변수는 일반적으로 동기화(Synchronized)의 대상이 아닙니다.

대다수의 프로그래밍 언어가 동기화의 단위가 메소드 또는 인스턴스입니다.

a data를 수정하고 있는데 b가 못 들어오게끔 lock을 걸어야 한다.

나한테 잔액이 balance : 1000

인터넷 뱅킹     atm

두개 동시에 수정 가능

A가 출금을 할 경우 lock이 생긴다.

B에서 lock이 되여있어서 사용못한다.

lock이 메소드 방식으로 한다. 변수로 하면 언제 끝나는지 모르겠다.

알림을 줘야 한다. 그럼 B에서 가면 된다.

메소드는 작업이니깐 작업이 끝나면 알림이 가능하다. 동기화의 대상이 메소드이다.

변수는 알림기능이 불가하다.

일을 해주는 것이 메소드이다.

 

1).getter

=>인스턴스 변수의 데이터를 리턴해주는 메소드

=>메소드의 리턴 타입은 인스턴스 변수의 리턴 타입과 동일하게 만듭니다.

=>메소드의 이름은 get변수명 으로 하는데 변수명의 첫글자는 대문자로 하고 변수의 자료형이 boolean인 경우는 get대신에 is를 사용하는 것이 관례

=>메소드의 내용은 인스턴스 변수를 리턴하는 것만 하는 것이 보통입니다.

 

2).setter

=>인스턴스 변수의 값을 설정하는 메소드

=>메소드의 리턴 타입은 void

=>메소드의 이름은 set변수명으로 하는데 변수명의 첫글자는 대문자

=>인스턴스 변수와 동일한 자료형의 매개변수를 받아서 인스턴스 변수에 그 값을 저장하는 내용을 소유

=>저장할 때는 다른 내용을 추가하기도 하는데 저장하기 전에 유효성 검사를 해서 저장 가능한 데이터인지 확인하는 작업이나 값이 변경된다는 내용을 다른 곳에 알려주기도 합니다.

key  - Value Observing이라고도 합니다.

: 신용도 바꿔면 메소드 온다든가

class T{

           private int age;    //private 은 클래스 내부에서만 사용이 가능

           private String name;

 

           //setter 메소드

           public void setAge(int n){

                       age = n;

           }

 

           public void setName(String n){

                       name = n;

           }

 

           //getter 메소드

           public int getAge(){

                       return age;

           }

 

           public String getName(){

                       return name;

           }

}

 

T ob = new T(); //인스턴스 생성

ob.setAge(50);

ob.setName("park");

System.out.println("이름:" + ob.getName());

 

3)최근에 등장한 IDE들은 대부분 접근자 메소드를 자동으로 만들어주는 기능을 제공

 

4)권장사항인데 인스턴스 변수가 SCALA DATA가 아닌 배열이나 List인 경우 인덱스를 받아서 하나만 가져오거나 하나만 수정하는 메소드도 만드는 것을 권장합니다.

 

2.Property(속성)

=>인스턴스가 변수를 호출하는 것처럼 사용하지만 실제로는 gettersetter와 같은 접근자 메소드를 호출하는 것

=>VB,VC#,PYTHON,KOTLIN,SWIFT등에서는 이 프로퍼티를 지원=>여기에서는 VECTOR이나 지원해서 그렇다. 인스턴스 변수 잘 사용하지 않는다.

 

?.X = 10(set x하는 것이다.)

=>java에서는 지원을 하지 않지만 java web programming 에서 EL을 이용해서 이 프로퍼티를 지원합니다.

 

3.DTO(DATA Transfer Object, Variable Object, Domain Class)

=>여러개의 정보를 묶어서 하나로 만들기 위한 클래스

어떤 것을 묶어서 하나로 만들것인가

 

4.실습 -DTO클래스를 만들고 main에서 클래스의 인스턴스를 만들고 내부 데이터 사용

1). DTO클래스

public class Student {

          

           //인스턴스 변수 선언

           private int num;

           private String name;

           private String major;

          

           //접근자 메소드

           //오른쪽 마우스 클릭 ->Source ->Generate getters and setters ->select All -> Generate

           public int getNum() {

                       return num;

           }

           public void setNum(int num) {

                       //this가 붙으면 메소드 내부에서는 찾지 않고

                       //메소드 외부에서 먼저 찾습니다.

                       //this.num은 메소드 외부에 있는 인스턴스 변수  num이고

                       //num 은 메소드의 매개변수 num이 됩니다.

                       this.num = num;

           }

           public String getName() {

                       return name;

           }

           public void setName(String name) {

                       this.name = name;

           }

           public String getMajor() {

                       return major;

           }

           public void setMajor(String major) {

                       this.major = major;

           }

          

}

 

2) main 메소드를 소유한 클래스

           public static void main(String[] args) {

                       // Student 클레스의 인스턴스 생성

                       Student student = new Student();

                       //인스턴스 변수에 값을 설정

                       student.setNum(1);

                       student.setName("park");

                       student.setMajor("CS");

                      

                       //인스턴스 변수의 값 가져오기

                       System.out.println("번호:"+student.getNum());

                       System.out.println("이름:"+student.getName());

                       System.out.println("전공:"+student.getMajor());

 

           }

 

**Recursion - Recursive Call(재귀 호출)

=>메소드가 메소드 내부에서 자신의 메소드를 다시 호출 하는 것

=>메소드는 호출되면 자신의 메모리 영역(Stack)을 생성하고 자신의 작업이 종료되면(return)자신의 메모리 영역을 해제합니다.

메소드의 작업이 종료되기 전에 다른 메소드를 호출하면 Stack이 쌓이게 됩니다.

메모리 사용량이 늘어나고 실행의 결과도 여러 번 되돌아 가는 구조를 갖기 때문에 늦게 나오게 됩니다.

=>알고리즘을 표현할 때 쉽게 표현할 수 있는 경우가 많아서 종종 이용합니다.

 

10까지의 합: 10 + 9 까지의 합(9+8까지의 합)

=>위와 같은 형태로 합을 구할려고 했는데 결과에 다시 합이 나오는 경우

=>이런 경우에는 반드시 종료 시점이 있어야 합니다.

합의 경우는 1까지의 합은 1 이렇게 종료 시점이 명확하게 있어야 합니다.

=>재귀로 구현 할 수 있는 것들로는 합계, 팩토로얼(), 피보나치 수열, 하노이의 탑, 퀵 정렬이나 병합 정렬등이 있습니다.

 

 

재귀 메소드 구현 방법

리턴타입 메소드이름(리턴타입과 동일한 자료형 매개변수이름){

           if(정료조건){

                       return ;

           }else{

                        return 메소드이름(매개변수);

           }

}

 

=>매개변수로 대입되는 데이터가 참조형이라면  return을 하지 않을 수도 있습니다.

 

1-n까지의 합을 구해주는 메소드(재귀를 이용)

int hap(int n){

           if(n ==1){

                       return 1;

           }

           return n + hap(n-1);

}

return n + hap(n-1); =>합이 합을 계속 하면 중단 할수 없어서 중단 조건을 만들어야 한다.

 

4까지의 합

4 + hap(3)

4 + 3 + hap(2)

4 + 3 + 2 + hap(1)

다음에는 1이니깐 return 1이 된다. 4+3+2+1

=>재귀를 만들 때 주의할 점은 반드시 중단을 하거나 아무일도 하지 않는 조건을 만들어야 한다는 것입니다.

그렇지 않으면 무한 반복하다가 프로그램이 메모리 부족으로 종료됩니다.

클래스 : 모형 설계도 공통된 내용

           저정 변수

           : 메소드

인스턴스 :제품

 

1fibonacci수열

1,1,2,3,5,8,13,21,34,55,89...

f2:1

f1:1

result :2

 

f2 = f1

f1 =result

result = f2+f1

 

 

첫번째와 두번째 항은 무조건 1

세번째 항 부터는 앞쪽 2개 항의 합

 

fn = f(n-1) + f(n-2)

f1= 1, f2 =1

 

재귀로 가능한 이유

f(10) ->f(9) + f(8)

감독관 배치 : 첫번째 감독관하고 두번째 감독관은 첫번쨰 빼고 .....

 

 

1)재귀를 이용하지 않고 해결

public int fibo1(int n){

           if (n == 1  || n ==2){

                       return 1;

           }

//ifreturn이 있으면 메소드 수행이 종료된다. 그래서 else사용할 필요 없다.

else{

           //피보나치 수열의 값을 저장할 변수

           int result = -1;

 

           //계산할 값 이전 2번째 항의 값을 저장할 변수

           int f2 = 1;

           //계산할 값 이전 1번째 항의 값을 저장할 변수

           int f1= 1;

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

                       result = f2 + f1;

 

                       f2= f1;

                       f1 =result;

           }

           //피보나치 수열의 값 리턴

           return result;

}

}

 

2)재귀를 이용해서 해결

public int fibo2(int n){

           if(n ==1 || n == 2){

                       return 1;

}else{

           return fibo2(n-1) + fibo2(n-2);

}

}

메소드 호출 -> 스택 1

fibo1(10)

stack 1메가 있으면 해결 가능하다.

 

피보나치 수열은 stack 의 개수가 늘어나서 메모리가 많아야 한다.

1).stack1메가 가지고 한다 그래서 피보나치는 메모리 방면에서 고려해야 한다.

2).fibo1은 한번 계산하면 끝난다.

fibo2는 시간도 많이 쓸수 밖에 없다. 왜냐하면 계산하면 돌아가야 한다.

느리고 시간이 많이 사용한다.

하노이탑 알고리즘 : 최적으로 옮기는 것

https://hyeonstorage.tistory.com/355

1.B2에 올린다.

2.A3에 올린다.

3.B3에 올린다.

1.C3에 올린다.

2. B2에 올린다.

3. C2에 올린다.

4. A3에 올린다.

5. C1에 올린다.

6. B3에 올린다

7. C3에 올린다.

 

그래서 하노이탑은 2n제곱의  -1 최적이다.

목적지 와 옮기는것

 

 

 

 

재귀는 메모리가 많을 쓰고 시간이 느리다.

재귀를 사용하지 않을 경우 빨리 나오는데

재귀를 사용하면 속도가 많이 느러진다.

 

c -> 성능은 높은데 난이도가 높다

python->성능은 낮은데 난이도가 낮다. => 빠를 가능성이 높다.

메모리 방면에서도 고려해야 한다.

 

sort

5 3 8 4 9 1 2

보통은 pivot을 첫번째 것으로 정하는데 책에서는 보통  random으로 설정한다.

sort  도 재귀를 사용하기 때문에 속도가 늦어질 수 있다.

 

5 3 8 4 9 1 2

1.5pivot로 설정한다. 3 4 1 2 5 8 9

5보다 작은 것을 왼쪽 5보다 큰 것을 오른쪽으로 이동한다.

3.왼쪽에서 3pivot로 설정한다. 3 4 1 2 중에서

 오늘쪽에서 8pivot로 설정한다. 8 9 중에서

1 2 3 4 5 8 9

4. 왼쪽에서 1 2중에서 1pivot로 설정한다.

한번 밖에 안되서

 

data 나열

pivot를 추측한다.

모든 데이터와 비교해서 pivot보다 작으면 왼쪽 크면 오른쪽

piov설정 후  quick sort

분할된 배열의 데이터 개수가 한개가 될때 까지 계속 수행한다.

sort =>quick sort

sort =>sort한다.

 

******

피본나치 수열

배열 만들고 출력 -> 합계 평균 -> 최소값의 위치 -> 정렬  ->선택, 버블 삽입

                                                                                 ->

string :문자열 메소드 구현

알고스팟 =>python으로 간단한 문제 들이 있다.

정올 

 

2.피보나치 수열 확인

main을 소유한 클래스 에 작성: 메소드의 코드를 읽어보고 매개변수를 50정도로 늘려서 둘의 차이를 확인

Main.java

// 재귀를 이용하지 않고 n번째 피보나치 수열의 값을 리턴하는 메소드

           //1 1 2 3 5 8 13 21 34 55

           public static int fibo1(int n) {

                       // 첫번째나 두번째는 무조건 1

                       if (n == 1 || n == 2) {

                                  return 1;

                       }

                       // 세번째 부터는 이전 2개 항의 합

                       else {

                                  int result = -1;

                                  // 현재 계산할 항의 이전 두번째 항의 값을 저장할 변수

                                  int f2 = 1;

                                  // 현재 계산할 항의 이전 첫번째 항의 값을 저장할 변수

                                  int f1 = 1;

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

                                              // 이전 2개 항의 합을 계싼하고 2개 항을 다음 항으로 이동

                                              result = f2 + f1;

                                              f2 = f1;

                                              f1 = result;

                                  }

                                  return result;

                       }

 

           }

 

           //재귀를 이용해서 피보나치 수열의 값을 찾아주는 메소드

           public static int fibo2(int n) {

                       if (n == 1 || n == 2) {

                                  return 1;

                       } else {

                                  //fibo2 메소드 네에서 fibo2를 호출하기 때문에 재귀라고 함

                                  return fibo2(n - 1) + fibo2(n - 2);

                       }

           }

 

 

           public static void main(String[] args) {

 

                       // staticstatic밖에 못 부른다.

                       // class는 역할 별로 하는 것이 좋다.

                       // 현재 클래스 내부에 있는 메소드를 호출할 때는 이름만 기재하면 됩니다.

                       int r = fibo1(50);

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

                      

                       // 재귀함수가 늦다. stack은 종료되면 없어진다.

                       r = fibo2(50);

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

                      

           }

**Constructor(생성자)

=>인스턴스를 만들 때 호출하는 메소드

=>생성자는 반드시  new라는 예약어와 함께 호출

1.자바에서의 생성자

1)클래스를 만들면 매개변수가 없는 기본 생성자가 제공되는데 클래스 안에 생성자를 만들면 이 생성자는 소멸됩니다.

2)생성자의 이름은 클래스이름으로 만들어야 합니다.

3)생성자 오버로딩(메소드 이름은 같고 매개변수의 개수나 자료형이 다른 경우)이 가능합니다.

 

Temp.java파일 만들기

public class Temp{

           public int x;

}

javac Temp.java

javap -c Temp > Temp.bc

public Temp{

           public int x ;

}

 

init하는 목적이

생성자 추가

public class Temp{

           public int x;

 

           public Temp(){

                      

           }

}

생성자에 내용이 없을 때 결과는 같다.

 

public class Temp{

           public int x;

 

           public Temp(int y){

                       x = y;

           }

}

2.생성자를 만드는 목적

=>인스턴스 변수의 값을 초기화할 목적으로 많이 생성

=>인스턴스가 생성될 때 다른 작업을 같이 수행하고자 하는 경우에도 생성

 

 

3.생성자를 만들때 주의할 점

=>매개변수가 없는 생성자를 default constructor라고 하는데 이 생성자가 없는 경우 생성자를 호출할 때 반드시 매개변수를 대입해야 합니다.

=>default constructor가 없는 클래스로 부터 상속받는 경우에는 반드시 생성자를 만들어서 상위클래스의 생성자를 호출하는 구문을 만들어 주어야 합니다.

이 경우는 andriod에서 많이 발생

 

4.실습

1).idpw를 문자열로 저장할 수 있는 클래스 생성 -Member

public class Member {

           private String id;

           private String pw;

          

          

           public String getId() {

                       return id;

           }

           public void setId(String id) {

                       this.id = id;

           }

           public String getPw() {

                       return pw;

           }

           public void setPw(String pw) {

                       this.pw = pw;

           }

          

          

}

 

2)main메소드를 소유한 실행 클래스를 만들고 main메소드 안에서 인스턴스를 만들고 값을 저장한 후 값을 출력

                       // Member 클래스의 인스턴스를 생성

                       //자바 개발자의 대부분은 인스턴스를 1개만 만드는 경우 클래스 이름의 첫글자만

                       //소문자로 변환해서 이름을 생성을 합니다.

                       //자바 개발을 할 때는 인스턴스를 자동으로 생성해주는 스프링 프래임워크를 많이 사용하는데

                       //스피링이 이름을 만들 때 이 규칙을 적용

                       Member mem1 = new Member();

                       System.out.println("id:" +mem1.getId() +" pw:" +mem1.getPw());

 

5.생성자를 별도로 만들지 않으면 인스턴스 변수의 값들은 기본값으로 채워집니다.

1)기본값

boolean ->false

정수 ->0

실수 ->0.0

나머지는 null

 

2)위의 실습 결과는 idnull그리고 pwnull이 출력

 

3)모든 인스턴스들이 idroot pw1234로 초기화된 상태에서 시작하도록 하고자 함

=>인스턴스를 만들고 setter .메소드를 호출해서 idpw값을 변경해서 해결 가능

 

 

                       Member mem1 = new Member();

                       mem1.setId("root");

                       mem1.setPw("1234");

                       System.out.println("id:" +mem1.getId() +" pw:" +mem1.getPw());

 

 

인스턴스를 1개만 생성한다면 위의 방법을 이용하는 것이 나쁘지 않지만 여러 개를 생성해야 하는 경우 매변 위와 같은 작업을 하는 것은 비효율적입니다.

                       Member mem1 = new Member();

                       mem1.setId("root");

                       mem1.setPw("1234");

                       System.out.println("mem1.id:" +mem1.getId() +" mem1.pw:" +mem1.getPw());

                      

                      

                       Member mem2 = new Member();

                       mem2.setId("root");

                       mem2.setPw("1234");

                       System.out.println("mem2.id:" +mem2.getId() +" mem2.pw:" +mem2.getPw());

오라클에서는 default sysdate와 같은 기능이다.

메소드 호출하면 stack에 할당하고 다시 돌아간다.

인스턴스 만들 때 만다 설정하면  set을 부럴 필요없다.

4개가 없으면 메모리 효율도 좋아지지 않는가

 

=>위와 같은 경우는 생성자를 만들어서 생성자에게 값을 설정하는 것이 효율적입니다.

 

4)Member클래스에 Idrootpw 1234를 설정하는 생성자를 만듬

           //Member클래스의 생성

           //생성자는 리턴 타입없이 클래스 이름을 그래도 사용

           //매개변수가 없는 생성자를  Default Constructor 라고 합니다.

           public Member() {

                       id = "root";

                       pw = "1234";

           }

 

5).main을 실행해보면 setter를 호출하지 않아도 root1234로 호출

 

6.매개변수가 있는 생성자

=>생성자는 오버로딩이 가능하기 때문에 기본 생성자가 있는 경우에도 매개변수가 있는 생성자를 만들 수 있습니다.

=>매개변수가 있는 생성자는 매개변수로 데이터를 대입받아서 인스턴스 변수를 초기화 할 목적으로 만듭니다.

=>외부에서 데이터를 주입받아서 인스턴스 변수를 초기화 할 수 있다면 setter메소드의 호출 횟수가 줄어들고

다양한 방법으로 인스턴스를 생성할 수 있게 됩니다.

=>객체 지향 언어에서는 생성자의 종류만큼 인스턴스를 생성할 수 있는 방법이 있습니다.

: 게임을 만들때

class Unit{

           // 총알을 가져와야 한다.

           int bullet; //기본적으로 총알을 500개 주고 싶다.

}

 

Unit unit = new Unit();

unit.bullet = 500;

비행기 만들고 500주고 해서 .계속 추가한다. 게임 100번하면 100번해줘야 한다.

여러개 만들면 메모리 할당 등 문제 있다.

 

 

그래서 기본적인 것을 다 주는게 낳다.

class Unit{

           int bullet;

           public unit(){

                       bullet = 500;

           }

 

           public unit(money){

           }

 

}

: graphic문제 4각형 그리기

생성자 만들면 4각형은 이렇게 만들면 되 제시해준다.

여러가지 형태의 생성자를 제공해준다.

Rect()

Rect(x1, y1, x2, y2);

Rect(x,y,w,h)

 

시작하는 방법이 여러개 있어야 한다.만들어지는 방법을 다양화 하고 싶을때 다양하게 만든다.

           public Member() {

                       id = "root";

                       pw = "1234";

           }

          

이것 없으면 데이터 안주고는 안된다.그래서 이것 삭제시는 돈이 있어야 돌아간다.

 

*** 생성자 만드는것

python에서 기본값을 안주고 해도 된다. __init__

 

 

생성자 만드는 이유

어떤 특정한 값을 하고 싶을때  -기본적으로 하는 것

여러가지 형태로 하고 싶을때 -매개변수 받아서 하는 것

 

7.this() & super()

=>생성자에서 자신의 클래스의 다른 생성자를 호출할 때는 this( 매개변수)를 이용할 수 있습니다.

=>super()는 상위 클래스의 생성자를 호출할 때 이용

생성자를 만들면 우리가 작성하지 않아도 가장 위에 super()  구문이 포함됩니다.

상위 클래스의 매개변수가 없는 생성자를 호출하는 구문입니다.

=>상위 클래스에 매개변수가 없는 생성자(Default Constructor)가 없는 경우 클래스를 상속받으면 에러가 발생합니다.

=>생성자를 만들지 않으면 이런 생성자가 자동으로 포함됨

public 클래스이름(){

           super();

}

상위 클래스의 매개변수가 없는 생성자를 호출하는 구문이 자동으로 포함되기 때문에 에러 발생

이런 경우에는 생성자를 만들고 super(매개변수)를 직접 호출해 주어야 합니다.

 

=>super()는 가장 위에 나와야 합니다.

=>this()super()를 제외하고 가장 위에 나와야 합니다.

 

8.인스턴스 배열에서의 생성자

=>인스턴스 배열을 만들 때 크기만 설정한 경우에는 각각의 인덱스에서 생성자를 호출해서 대입해 주어야 합니다.

 

클래스이름 [] 배열이름 =  new 생성자이름[개수];

=>개수 만큼의 인스턴스를 저장할 수 있는 공간이 생성된 것입니다.

위의 경우는 인스턴스는 만들어지지 않았습니다.

배열이름[인덱스] = new 생성자(); 를 호출해서 각각에 대입을 해주어야 합니다.

 

=>main메소드에 작성하고 실행

                       //Member 클래스의 인스턴스 배열을 생성

                       //Member 인스턴스의 참조를 저장할 수 있는 공간 2개를 생성

                       Member[] ar = new Member[2];

                       for(Member imsi : ar) {

                                  System.out.println(imsi); //null결과가 다 null로 나온다. 안 만들어졌다.

                       }

                      

                       //공간에 인스턴스를 생성해서 대입

                       ar[0] = new Member();

                       ar[1] = new Member();

                       for(Member imsi : ar) {

                                  System.out.println(imsi);

                                  //java0108.constructor.Member@15db9742

                                  //java0108.constructor.Member@6d06d69c

                       }

 

 

9.인스턴스 필드 이니셜라이저

=>클래스 안에 {}를 만들고 괄호 안에 내용을 작성하면 생성자를 호출할 때 {}안의 내용이 자동으로 수행됩니다.

 

=>Member클래스에 작성하고  main을 실행해서 생성자가 호출 될 때 마다 코드가 실행되는지 확인

           //static {}는 클래스를 처음 사용할 때 1번만 호출

           //게임할때 로그 한번만 보고 싶을때 첫번쨰 초기화

          

          

           //클래스 안에 {}를 만들고 작성하면 생성자를 호출할 때

           //생성자 보다 먼저 호출되서 내용을 수행

           //할때 마다 보여줘야 할 경우

           {

                       System.out.println("객체를 생성합니다.");

           }

 

 

 

10.참조형 변수 사이의 대입

=>참조형 데이터는 실제 데이터가 아니라 참조를 대입해주기 때문에 참조형 변수끼리 대입을 하면 동일한 영역을 가리키게 됩니다.

=>하나의 변경이 다른 하나에 영향을 주게 됩니다.

=>특별한 경우가 아니면 참조형 변수 사이의 대입은 하지 않는 것이 좋습니다.

=>참조형 변수의 데이터는 되도록이면 복제를 해서 다른 곳에 대입하는 것이 좋습니다.

복제를 하는 방법은 보통 2자리를 권장하는데 하나는 복사 생성자를 이용하는 것이고 다른 하나는 clone이라는 메소드를 만들어서 넘겨주는 것 입니다.

=>생성자 중에서 자신의 자료형을 매개변수로 받는 생성자가 있으면 이것은 복사 생성자이면 java에서 clone메소드는 현재 인스턴스를 복제해서 새로운 인스턴스를 만들어서 리턴하는 메소드입니다.

실제 개발 할 경우 많이 사용합니다.

commit rollback

응용 프로그램 만들때

대표적인것은 power point

office에서는 임시파일이 먼저 만들어진다.

저장 누르기 전까지는 반영이 안된다.

1) main 메소드에 작성해서 참조형 변수 사이의 대입 확인

                       //하나의 인스턴스를 생성하고 내부 데이터 설정

                       Member origin = new Member();

                       origin.setId("gggg");

                       origin.setPw("100100100");

                      

                       //참조형 사이의 대입

                       //origin이 가리키고 있는 인스턴스를 weak도 가리킵니다. call by reference

                       Member weak = origin;

                      

                       //weak id를 변경했는데 origin것도 변경

                       weak.setId("dddd");

                       System.out.println(weak.getId());  //dddd

                       System.out.println(origin.getId());//dddd

 

2)동일한 값을 갖는 인스턴스를 사용하고자 할 때 복제해서 사용하는 것을 권장

이 복제하는 것을 다른 말로 Deep Copy라고 합니다.

 

 

R과 다른 프로그래밍의 차이점:

R

파이썬의 분석라이브러리

 

기본적으로 작업을 하게 하면 결과를 리턴한다. 원본에 작업을 하는 경우는 드뭄

R <- ,= 이것등 많이 사용한다.

R은 가공해서 데이터 사용한다.

복재는 메모리 2배사용한다.

원본데이터 ->가공 ->모델 생성 ->평가

평가는 모델이 제대로 됬는지 알 수 없다.

정확도가 50%정도 나오면 다시 시작해야 한다.

다시 원본데이터로 돌아가야 한다.

수집 ->데이터를 만들고 ->탐색해서 보고 ->가공 -> (샘플링) -> 모델 생성 ->평가 ->보고서 / 제품

가공 ->데이터 바꾸는 것

원본을 변경 시키면 수집부터 다시 해야 한다.

가공을 할 때 복사본을 가공할 경우 데이터 까지만 돌아가면 된다.

 

=>아래는 원본을 바꿔는 케이스라서 아래 방식은 안좋다.

r = 데이터

r = r가공

 

시간은 수집이 잴 오래 걸린다.

 

변수 handleng하고 파일 중에서

 

cpu -> MainMemory(변수)       <-> 디스크

<->네트워크

cpu재일 비싸다.

왼만하면 디스크나 네트워크로 안간다.

MainMemory용량이 부족할 때 디스크 그다음 네트워크

 

복제하면 메모리가 많이 필요하다.메모리를 많이 사용한다.

그래서 스마트폰에서는 복제를 하지 않았느데 최근에는 좀한다.

 

deep copy  copy() deepcopy()

 

3)Member 클래스에 복사 생성자를 추가하거나 clone메소드 추가

=>복사 생성자는 자신과 동일한 자료형의 매개변수를 갖는 생성자를 만들고 그 안에서  데이터를 전부 복사해서 리턴하도록 만들저주면 됩니다.

=>이러한 일을 해주는 메소드를 만들 때는 이름을 clone으로 만드는 것을 권장

 

=> Member클래스에 추가

           //인스턴스르 복제해주는 메소드

           public Member clone() {

                       //인스턴스를 새성

                       Member other = new Member();

                       //데이터를 복제

                       other.id = this.id;

                       other.pw = this.pw;

                       //복제된 데이터를 갖는 객체를 리턴

                       return other;

           }

          

 

cloud등 만들때 clone이 매우 중요하다.

=>MAIN메소드에 코드를 작성하고 확인

                       //origin을 복제해서 대입

                       Member deep = origin.clone();

                       //현재는 내용이 같습니다

                       System.out.println(deep.getId());  //dddd

                       System.out.println(origin.getId());//dddd

                      

                       //복제를 해서 deep에 대입해주었기 때문에 변경하기 전에는 같은 내용을 같지만

                       //한쪽에서 내용을 변경해도 다른쪽에는 영향이 없기 떄문에 deep의 내용을 변경해서 origin은 그대로

                       deep.setId("ddfdfd");

                       System.out.println(deep.getId());  //ddfdfd

                       System.out.println(origin.getId());//dddd

 

11. java에서의 메모리 정리

=>heap에 만들어진 데이터는 프로그램 실행 도중 메모리 정리를 할 수 있는데 java에서는 가리키고 있는 변수가 없으면 정리 대상이 되고 시스템이 필요한 시점에  garbage collection을 호출해서 정리를 합니다.

=>강제로 메모리 정리를 시키고 싶다면 참조형 변수에 null을 대입해서 정리 대상이 되도록 할 수 있습니다.

=>참조형 사이에 대입을 하게 되면 변수에 null 을 대입해서 메모리 정리가 안 될 수 있습니다.

 

Member origin = new Member();

Member weak = origin;

origin = null;//null을 대입해도 메모리 정리 대상이 안됩니다. origin2개 가리키고 있기 때문이다.

weak = null;//이것 까지 해주어야만 메모리 정리가 됩니다.

 

a= b =>이경우는 메모리 정리가 잘 안되고 소스읽기도 불편할 경우가 많다. 참조형 데이터 등

이 작업을 하는 경우는

=>참조형 변수의 데이터를 다른 참조형에 대입하는 경우는 메소드 안에서 만들어진 참조형 데이터를 외부에서 사용하기 위해서 외부변수에 대입하는 경우가 대부분

 

생성자가 없으면 자동으로 만들어준다.

변수나 메소드가 없을 수 도 있다.

클래스 만드면 모아서 저장하겠다고 생각한다.

 

데이터베이스 테이블

*클래스 ->저장하고 싶은 항목 : 변수

           ->변수에 접근할 수 있는 접근자 메소드

        ->변수의 값을 초기화하는 생성자

작업클래스 (모양이 어떻게 된느지?)

è  여러개를 가져오는  메소드

è  한개를 가져오는 메소드

è  삽입하는 메소드

è  삭제하는 메소드

è  갱신하는 메소드

: 게사판 게시물

 

**게시판 작업

1.클래스 구성

1).게시판 데이터 1개를 저장할 클래스 (글번호, 제목 , 내용)

2).게시판 작업을 위한 클래스

=>게시판 전체 목록을 리턴하는 메소드

=>글 번호를 받아서 글 번호에 해당하는 데이터 1개를 리턴하는 메소드

=>게시판 데이터를 매개변수로 받아서 저장하는 메소드

=>게시판 데이터를 매개변수로 받아서 수정하는 메소드

=>글 번호를 받아서 글 번호에 해당하는 데이터를 삭제하는 메소드

 

이런한 5가지 작업을 curd(create, read, update, delete) 라고 합니다.

 

 

 

3).실행 클래스(나중에는 UI로 담당하는 부분(View)과 이벤트를 처리하는 부분으로 분할(EventHandler, Controller))

 

2.게시판 데이터를 저장할 클래스를 생성

=>글번호 , 제목 , 내용을 저장하는 클래스

=>글번호는 1번부터 자동으로 생성

=>출력하는 메소드에 인스턴스를 대입하면 인스턴스의 내용을 출력해주도록 하는 메소드

 

li = [10,20]

print(li) =>li.__str__

 

package java.study;

 

public class Board {

           //저장할 항목을 private 변수로 생성

           //글번호 ,제목, 내용

           private int num;

           private String title;

           private String content;

          

           //인스턴스 변수 사용을 위한 접근자 메소드

           public int getNum() {

                       return num;

           }

           public void setNum(int num) {

                       this.num = num;

           }

           public String getTitle() {

                       return title;

           }

           public void setTitle(String title) {

                       this.title = title;

           }

           public String getContent() {

                       return content;

           }

           public void setContent(String content) {

                       this.content = content;

           }

          

           //디버깅을 위한 메소드

           //출려가는 메소드에 인스턴스를 대입했을 때 호출되는 메소드

           //자바는 인스턴스를 출력하는 메소드에 대입하면  toString 이라는 메소드가 호출됩니다.

           //인스턴스 변수의 값을 전부 확인하고자 할 때 일일이 get메소드를 부르는 것은 코드의 낭비

           //이런 경우에는 toString()을 호출해서 한번에 확인

           @Override

           public String toString() {

                       return "Board [num=" + num + ", title=" + title + ", content=" + content + "]";

           }

 

}

3.java 단위 테스트

=>java Application을 실행할려면 main메소드를 갖는 클래스가 필요

=>Java Web Application을 실행할려면 WAS가 필요

=>부분적으로 로직을 만들고 로직을 테스트하기 위해서 main을 만드는 것이나 was를 이용해서 실행하는 것은 자원의 낭비

=>java로직을 테스트하기 위한 라이브러리가 이클립스에서 제공되는데 이름은 JUnit

=>JUnit라티브러리르 추가하고 클래스를 만든 후 메소드 위에 @Test라고만 붙이면 단위테스트가 가능

main없어도 가능하다.

 

 

1) JUnit라이브러리를 프로젝트에 추가(java버전 변경도 동일한 메뉴)

=>프로젝트 선택하고 마우스 오른쪽을 클릭하고 [Build Path] ->[Configure Build Path]를 선택

=>Libraries 탭에서 [add library]버튼을 클릭하고 JUnit을 선택

45버전을 선택하고 apply

2)테스트를 위한 클래스 생성 -클래스 이름은 Test만 아니면 된다.

package java.study;

 

import org.junit.Test;

 

public class BoardTest {

 

           //테스트 메소드 만들기

           @Test

           public void testMethod() {

                       Board board = new Board();

                       System.out.println(board);

           }

}

 

 

3)테스트 할 때는 클래스 내부 아무곳에서나 커서를 두고 마우스 오른쪽을 클릭하고 [Run As] -[JUnit Test] 를 클릭하면 됩니다.

 

Board의 내용을 출력한다.

현재 결과는 num = 0 title= null content = null로 출력

 

 

TDD(Test Driven Development) 테스트 주도 개발

예전방식:

분석

 

설계

 

구현

 

테스트

최근에는 테스트 하면서 구현

중간중간 테스트 무료로 사용한 가장 쉬운것은 junit

 

4.static변수와 생성자를 이용해서 num의 값을 일련번호로 대입

=>static변수는 1번 만들어지면 소멸되지 않고 계속 사용할 수 있습니다.

=>instance변수는 instance가 생성될 때 마다 별도로 생성됩니다.

=>Board클래스에 코드를 작성하고 Test메소드를 수정한 후 확인

 

1)Board클래스 코드  추가

           //일련번호 생성을 위한  static 변수를 1개 생성

           private static int sequence;

          

           //생성자

           public Board() {

                       //static변수는 이전에 수정한 내용을 가지고 있기 때문에 1씩 증가

                       sequence = sequence+1;

                       //num은 인스턴스 변수라서 생성자를 호출 할 때 마다 매번 새로 생성

                       //새로 생성되는 numsequence의 값을 대입하면 일려번호가 됩니다.

                       num = sequence;

           }

numinstance변수 부를때마다 새로 생성된다.

sequence static변수이다. 새로 생성되지 않는다.

static은 값을 계속 이어서 가지는 것이다.

 

2)Test메소드를 수정하고 실행

           //테스트 메소드 만들기

           @Test

           public void testMethod() {

                       Board board = new Board();

                       System.out.println(board);

                      

                       Board board1 = new Board();

                       System.out.println(board1);

           }

5.작업을 위한 클래스 - BoardService

package java.study;

 

//게시판 작업을 위한 메소드

public class BoardService {

           //Board 100개를 저장할 수 있는 공간을 100개 생성해서 이름을 list라고 붙임

           //Board가 아니고 Board가 가르킬 수 있는 것이 100개 이다.

           Board[] list = new Board[100];

          

           //Board[]이것은 현재는 배열이지만 리스트 배우면 리스트로 바꾼다.

          

           //전체 목록이나 일부 목록을 리턴하는 메소드

           //return 타입은 List

           //일부 목록을 가져올 때는 매개변수로 페이지 번호를 갖는 경우가 많습니다.

           public Board[] getList() {

                       return list;

           }

          

           //페이지 번호에 해당하는 데이터를 가져오는 메소드

           //제목이나 내용을 주고 싶을 경우

           //list 0 -99

           public Board[] getList(int pageNo) {

                       //한 페이지에 10개씩 있다고 가정

                       //0 -9 번 까지

                       Board[] r = new Board[10];

                      

                       //pageNo 1일 때는 0 9., pageNo 2일 때는 10 19

                       int start = (pageNo-1) * 10;

                       int end = pageNo * 10 -1;//end는 안 여줘도 된다. 10페이지 구해서 여주면 되기때문에

                       //시작과 끝이 9 차이나면 된다.

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

                                  r[i] = list[start +1];

                       }

                      

                       return null;

           }

          

           //글번호에 해당하는 데이터를 1개 가져오는 메소드

           //기본키를 매개변수로 받아서 처리

           //상세보기를 처리하는 메소드

           //메일 보기도 같다.

           public Board getBoard(int num) {

                       //list 에서 num이라는 글 번호를 가진 데이터를 찾아서 리턴

                       Board board = null;

                       //list를 순환하면서 num과 같은 글번호를 가진 데이터를 board에 대입

                       for (Board temp: list) {

                                  if(temp != null) {

                                              //동일한 글 번호를 찾으면 더 이상 반복문을 수행할 필요가 없어서 break

                                              if(temp.getNum() == num) {

                                                         board = temp;

                                                         break;

                                              }

                                  }

                       }

                       //동일한 글번호가 없으면 null을 리턴

                       //디비 연동으 framework를 이용한다.

                       //selectList selectOne 없으면 null

                       //증복검사,로그인 할때 등 null확인 해야 한다.

                       return board;

           }

          

           //글쓰기를 처리하는 메소드

           //데이터 삽입을 처리하는 메소드

           //수행 결과를 알려주고자 할 때는 boolean이나 init로 리턴

           //수행 결과를 알려주지 않고자 할 때는 void(실패는 없다라는 가정)

           //매개변수는 데이터 1

           private int cnt;

           public boolean insertBoard(Board board) {

                       //맨 마지막 위치에 데이터를 대입

                       list[cnt] = board;

                       cnt = cnt+1;

                       return true;

           }

          

           //글수정을 처리하는 메소드

           //리턴 타입은 삽입과 동일

           //매개변수도 삽입과 동일

           //수정을 할 때는 기본키(글번호)의 값이 자동으로 설정되는 것 이 다릅니다.

           public boolean updateBoard(Board board) {

                       //글번호에 해당하는 데이터를 찾아서 데이터를 찾으면 board로 대체

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

                                  Board imsi = list[i];

                                  //글번호 비교

                                  if(imsi != null) {

                                              if(imsi.getNum() == board.getNum()) {

                                                         list[i]  = board;

                                                         break;

                                              }

                                  }

                       }

                       return true;

           }

          

           //삭제를 처리하는 메소드

           //삭제를 할 때는 데이터 전체가 필요하지 않고 일반적으로 기본키만 필요합니다.

           public boolean deleteBoard(int num) {

                       //list에 모든 데이터를 순회해서 글번호가 num인 데이터를 찾아서 그 위치에 null을 대입

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

                                  Board imsi = list[i];

                                  //글번호 비교

                                  if(imsi != null) {

                                              if(imsi.getNum() == num) {

                                                         list[i]  = null;

                                                         break;

                                              }

                                  }

                       }

                       return true;

           }

          

}

 

 

6.실행 클래스를 만들어서 실행

스크립트 언어가 아니면 entery point가 있어야 한다.

python entery point가 있다. __main__.py

여기에 있는 것을 먼저 실행해야 한다. python은 모듈이름으로

java, c ,c# main

=>main 메소드를 소유한 클래스를 생성

제대로 ui동작하는지 확인해야 한다.

 

java는 다중상속이 안된다.

반응형

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

java-7  (0) 2020.09.27
java-6  (0) 2020.09.26
java-4  (0) 2020.09.22
java-3  (0) 2020.09.20
java-2  (0) 2020.09.20
반응형

**데이터 정렬
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
반응형

 

**자바에서의 제어문

1.    분기문: if(조건에 의한 분기 - boolean), switch(값에 의한 분기- 정수, 문자열)

2.    반복문: while, do ~ while, for

3.    규칙

A.     제어문은 하나의 블록이어서 제어문 안에 만든 변수는 제어문 안에서만 사용이 가능

B.     제어문 내의 실행 문장이 하나의 명령어라면 {} 생략 가능

C.     제어문 안에 제어문을 포함할 수 있음

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

System.out.println(“i:” + i);        

}

               System.out.println(“i:” + i); //이 구문은 에러

 

           for (int i=0;i<10;i=i+1)

                       System.out.println(“i:” + i);

                       //이 경우 실행 명령어가 1개 이므로 {} 를 생략할 수 있음

                       //이 경우 들여쓰기를 정확하게 하지 않으면 코드의 가독성을 떨어뜨릴 수 있기 때문에 권장하지는 않음

 

수집 → 탐색 → 가공 → 알고리즘-모델 → 평가

작업할 때는 블록을 나눈다던가 파일을 나눈다던가 클래스를 나누는 등의 노력이 필요함.

프로그램의 유지보수를 위해서.

 

기타제어문

1.    Break

A.     swtich구문에서 switch 구문을 종료하거나 반복문에서 조건문과 함께 사용되서 반복문을 중단하는 역할을 수행하는 명령어

2.    continue

A.     반복문에서 조건문과 함께 사용돼서 다음 반복으로 넘어가는 역할을 수행하는 명령어

 

                       // 1부터 10까지 출력하는 구문

                       for (int i = 1; i < 11; i = i + 1) {

                                  // 4의 배수가 되면 반복문 중단 - 1, 2, 3 중단

                                  if (i % 4 == 0) {

                                              break;

                                  }

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

                       }

                       // 이클립스나 인텔리j를 사용할 땐 if줄만 없을 땐 에러로 표기 - 도달할 수 없는 코드

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

                       for (int i = 1; i < 11; i = i + 1) {

                                  // 4의 배수가 되면 다음 반복으로 ㅇ동

                                  // 1, 2, 3, 5, 6, 7, 9, 10

                                  if (i % 4 == 0) {

                                              continue; // ~할 때는 빼고 ->이럴 때 사용할 수 있음

                                  }

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

                       }

           }

 

3.    Java에서는 반복문에 레이블을 설정할 수 있고 break continue를 할 때 뒤에 레이블을 붙이면 레이블이 반복문을 빠져나가거나 다음 반복으로 이동할 수 있다.

A.     C언어에는 go to가 있어서 특정한 레이블이 붙은 곳으로 바로 이동이 가능

B.     구조적 프로그래밍 기법에서 go to 사용을 배제하는 것을 권장

C.     java에서는 go to 사용을 배제하기 위해서 예약어지만 사용할 수 없도록 함

D.    여러 개의 반복문에서 break만으로 여러 개의 반복문을 빠져나가는 것이 복잡해졌다.

E.     반복문에 레이블을 붙일 수 있도록 함

 

                      i.        레이블 추가

레이블 : 반복문

                     ii.        레이블 사용

break 레이블;

                    iii.        레이블이 없는 경우는 가장 가까이서 만든 반복문을 중단

 

outer : for(int i=1 ; i<=10 ; i=i+1){

for(int j=1 ; j<=10 ; j=j+1){

if(j%3==0){

break; //바로 위 j 인자 for문만 빠져나온다

break outer; //break outer의 밖으로 나간다.

//여러 개의 반복문을 빠져나올 때 유용한 레이블

}

}

}

 

제어문 연습

1.    교번 처리

A.     일정한 패턴 반복, 나머지 연산자 이용

B.     ON OFF를 교대로 10번 출력

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

if(i%2==0){

System.out.println(“ON”);

}

else{

System.out.println(“OFF”);

}

}

2.    #동아일보에서 자바로 검색했을 때 총 데이터 건수는 1164개이고 url은 아래와 같은 형태, 페이지마다 p의 값이 15씩 증가

제어문을 이용해서 전체 데이터를 스크랩할 수 있는 url을 생성

먼저 구해야 하는 것은 전체 데이터 건수를 가지고 몇 번 반복문을 수행해야 하는지 찾아야 하고 반복문 안에서 url을 만들어주어야 한다.

http://www.donga.com/news/search?check_news=1&more=1&sorting=1&range=1&search_date=&query=%EC%9E%90%EB%B0%94

http://www.donga.com/news/search?p=16&query=%EC%9E%90%EB%B0%94&check_news=1&more=1&sorting=1&search_date=1&v1=&v2=&range=1

 

http://www.donga.com/news/search?p=1&query=자바

http://www.donga.com/news/search?p=16&query=자바

http://www.donga.com/news/search?p=31&query=자바

 

                       // 첫 번째 페이지 URL

                       // http://www.donga.com/news/search?p=1&query=자바

                       // 각 페이지마다 기사가 15개씩 있어서 p의 값이 15씩 증가

                       // 총 데이터 건수는 1164

                       int total = 1164;

                       // 페이지 개수 만들 때는 나누어 떨어지지 않으면 몫+1

                       int pagesu = 1164 / 15;

                       if (total % 15 != 0) {

                                  pagesu = pagesu + 1;

                       }

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

                                  // 페이지 별 기사의 시작 번호

                                  int p = 15 * i + 1;

                                  // 기사의 url 만들기

                                  System.out.println("http://www.donga.com/news/search?p=" + p + "&query=자바");

 

                       }

 

3.    정수를 입력받아서 소수 판별하기

A.     소수(Prime): 2부터 자신의 절반이 되는 숫자까지 나누어서 한 번도 나누어 떨어지지 않으면 소수

 

                       //하나의 정수 입력받기

                       Scanner sc = new Scanner(System.in);

                       System.out.println("소수 판별할 정수 입력:");

                       int su = sc.nextInt();

                      

                       //소수 판별을 위한 플래그 변수 생성

                       boolean flag = false;

                       for(int i=2 ; i<=su/2 ; i=i+1) {

                                  //이 경우는 소수가 아님

                                  //조건을 만족한 경우 플래그 변수의 값을 변경

                                  if(su%i==0) {

                                              flag = true;

                                              break; //자주 쓰이는 표현 방식

                                  }

                       }

                      

                       //su가 소수인지 출력

                       if(flag == false) {

                                  System.out.println(su + "는 소수");

                       }

                       else {

                                  System.out.println(su + "는 소수가 아님");

                       }

                 sc.close();

 

4.    2-100까지 소수의 개수 구하기

 

                       // 4.2-100까지 소수의 개수 구하기

                       // 하나의 정수 입력받기

                       for (int i = 2; i <= 100; i++) {

                                  //소수 판별을 위한 플래그 변수 생성

                                  boolean flag = false;

                                  for(int j=2 ; j<=i/2 ; j++) {

                                              //이 경우는 소수가 아님

                                              //조건을 만족한 경우 플래그 변수의 값을 변경

                                              if(i%j==0) {

                                                         flag = true;

                                                         break; //자주 쓰이는 표현 방식

                                              }

                                  }

                                 

                                  //su가 소수인지 출력

                                  if(flag == false) {

                                              System.out.println(i + "는 소수");

                                  }

                                  else {

                                              System.out.println(i + "는 소수가 아님");

                                  }

            }

 

5.    반복문 2개를 이용한 별 출력

1개 출력: System.out.print(“*”)

줄바꿈: System.out.print(“\n”);

System.out.println(“”)’

*****

*****

*****

*****

*****

                      

 

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

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

                                  System.out.print(“*”);

                       }

                       System.out.print(“\n”);

           }

 

 

 

 

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

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

                                  System.out.print(“*”);

                       }

                       System.out.print(“\n”);

           }

 

 

 

 

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

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

                                  System.out.print(“*”);

                       }

                       System.out.print(“\n”);

           }

 

 

 

 

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

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

                                  System.out.print(“*”);

                       }

                       System.out.print(“\n”);

           }

 

 

 

 

아래처럼 계속 하나의 패턴이 적용되는 것이 아니고 일정한 패턴이 적용되다가 다른 패턴이 적용되면 분할해서 구현

처음 3줄은 늘어나고 다음 2줄은 줄어드는패턴

 

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

                       if(i<=2){

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

                                              System.out.print(“*”);

                                  }

}

                       else{

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

                                              System.out.print(“*”);

                                  }

}

System.out.print(“\n”);

           }

 

 

 

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

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

                                              System.out.print("*");

                                  }

                                  System.out.print("\n");

                       }

 

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

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

                                  if (i <= 2) {

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

                                                         System.out.print("*");

                                              }

                                  } else {

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

                                                         System.out.print("*");

                                              }

                                  }

                                  System.out.print("\n");

                       }

 

           }

 

 

하나의 정수를 입력받아서 아래처럼 출력하기

5를 입력한 경우

       0

1 2

     3  4

5     6

789012345

 

과제:

0앞에 공백이 4

1앞에 공백이 3개 그리고 12사이에 공백 1

3앞에 공백이 2개 그리고 3 4사이에 공백이 3

5앞에 공백이 1개 그리고 56사이에 공백이 5

아래쪽에는 숫자가 9개의 숫자를 출력

9다음의 숫자는 다시 0

 

                       /**

                        * 하나의 정수를 입력받아서 아래처럼 출력하기 5를 입력한 경우 0 1 2 3 4 5 6 789012345

                        *

                        * 과제: 0앞에 공백이 4 1앞에 공백이 3개 그리고 1 2사이에 공백 1 3앞에 공백이 2개 그리고 3 4사이에 공백이 3 5앞에

                        * 공백이 1개 그리고 5 6사이에 공백이 5개 아래쪽에는 숫자가 9개의 숫자를 출력 9다음의 숫자는 다시 0

                        */

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

                       Scanner sc = new Scanner(System.in);

                       System.out.println("하나의 정수 입력:");

                       int su = sc.nextInt();

                       int cnt = 0;

                       int max = 0;

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

 

                                  // 왼쪽 채우기

                                  cnt = 0;

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

                                              System.out.print("*");

                                              cnt = cnt + 1;

                                  }

                                  // 숫자

                                  if(max == 10) {

                                              max = 0;

                                  }

                                  System.out.print(max);

                                  cnt = cnt + 1;

                                  if(i != 0) {

                                              max = max + 1;

                                  }

 

                                  // 오른쪽 빈칸 채우기

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

                                              if (i < su - 1) {

                                                         System.out.print("*");

                                                         cnt = cnt + 1;

                                              }

                                  }

                                 

                                  // 오른쪽 숫자 계산

                                  if (i != 0) {

                                              if(max == 10) {

                                                         max = 0;

                                              }

                                              System.out.print(max);

                                              cnt = cnt + 1;

                                  }

                                 

                                  //아래 줄 숫자 계산

                                  max = max + 1;

                                  if(cnt != su + i ) {

                                             

                                              outer:for(;;) {

                                                         if(max == 10) {

                                                                     max = 0;

                                                         }

                                                         System.out.print(max);

                                                         max++;

                                                         cnt = cnt + 1;

                                                         if(cnt == su+i) {

                                                                     break outer;

                                                         }

                                              }

                                  }

                                  System.out.println("");

                                 

                       }          

                 sc.close();

 

 

Array(배열)

      동일한 자료형으로 구성된 데이터의 연속적인 집합

      참조형으로 heap(메모리 할당을 하고 프로그래머가 메모리 해제를 할 수 있는 공간)에 생성

      참조형이므로 변수는 데이터의 시작위치를 의미함.

1.     배열을 사용하는 이유: 관리의 편리성 때문

편리한 관리

A.     3명의 점수를 저장해야 하는 경우

B.     이 때 배열이 없다면 3개의 변수를 만들어서 각각 저장

C.     배열을 이용하면 하나의 이름으로 저장해서 관리 가능

2.     배열 생성

A.     처음부터 데이터가 존재하는 경우

배열 요소의 자료형[] 배열이름 = {데이터를 나열};

이 때 []는 배열이름 다음에 입력해도 되는데 대부분 앞에 기재

B.     데이터가 존재하지 않아서 크기만 먼저 만드는 경우

배열 요소의 자료형[] 배열이름 = new 배열 요소의 자료형[개수];

개수만큼 저장할 수 있는 공간을 만들고 기본값으로 채움

Booleanfalse로 숫자 데이터는 0으로 채워지고 참조형은 null로 채워짐.

C.     배열은 한 번 만들면 크기가 변경되지 않는다.

3.     배열 요소의 접근

A.     배열이름[인덱스] 형태로 접근해서 읽고 쓰기를 한다.

B.     인덱스는 0부터 시작한다.

C.     배열이 만들어지지 않은 상태에서 데이터에 접근하면 NullPointerException 발생

D.     배열의 인덱스 범위를 넘어서면 ArrayIndexOutOfBoundsException 발생

E.     배열의 데이터 개수 확인은 .length 를 호출

4.     참조형에서 메모리 해제

A.     가리키고 있는 변수가 없으면 Garbage Collection이 알아서 메모리 해제

B.     보통은 사용이 끝나면 null을 대입해주면 나중에 자동으로 해제된다.

 

//초기 값을 가지고 문자열 배열을 생성

                       String [] strAr = {"발렌수엘라", "클레멘테", "루게릭"};

                      

                       //데이터 1개 출력 - 0번째 데이터 출력

                       System.out.println(strAr[0]);

                      

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

                      

                       //데이터 전체 출력

                       //배열이름.length는 배열의 데이터 개수를 정수로 리턴

                       for(int i=0 ; i<strAr.length ; i=i+1) {

                                  System.out.println(strAr[i]);

                      }

                      

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

 

                       //배열을 기본값으로 만들고 나중에 데이터를 채우기

                      

                       //참조형 변수가 생성된 것인지 데이터가 만들어진 것은 아니어서 NullPointerException

                       /*

                       String [] homerunHitters = null;

                       System.out.println(homerunHitters[0]);

                       */

                      

                       String [] homerunHitters = new String[3];

                       //공간만 할당받은배열에 데이터 채우기

                       homerunHitters[0] = "김봉연";

                       homerunHitters[1] = "이만수";

                       homerunHitters[2] = "김성한";

                       //ArrayIndexOutOfBoundsException 발생

                       //homerunHitters[3] = "김성래";

                      

                      

                       //반복문 안에서 동일한 참조형 내부 테이터를 접근하는 것은 비효율적

                       for(int i=0 ; i<homerunHitters.length ; i=i+1) {

                                  System.out.println(homerunHitters[i]);

                 }

5.     배열을 생성하고 배열의 데이터를 접근하고 출력한 후 메모리 해제

6.     배열은 빠른 열거(Iterator) 형태로 접근 가능

A.     for(임시변수 : 배열) {

임시변수를 이용하면 배열의 모든 요소를 순서대로 하나씩 접근 가능

}

7.     배열의 데이터를 전부 접근하는 경우에는 빠른 열거가 효율적이고 일반적인 반복문을 이용할 때는 데이터의 개수를 반복문 바깥에서 임시변수에 저장하고 접근하는 것을 고려

 

기본형 – Scala data

참조형 – Vector data

 

 

 

 

 

 

 

기본형   

           scala data

참조형  vector data

기본형 -> data

참조형 ->시작 주소 ->[0]

                          ->이름

li = [10,20]

print(li) -> li.__str__ =>참조형이다.

li.시작위치 가르킨다.

참조형은 데이터 쫓아다닐 때 한 번 더 가야한다.

String[] names= {"지지히","고슬링"}

for (int i = 0;i < names.length; i++){

           System.out.println(names[i])

}

names 시작주소 ---------->0

                       [0] 지지히

                       [1] 고슬링

                       length 2

i : 0 -> i < names.length  i < length 2

           지지히

           고슬링

            다시 for i = 2

                       len ->2

int len = names.length; -> 결과는 같지만 안의 원리는 좀 다르게 한다.

i< len

i - 0 1 2  지지히

            고슬링

length 2

len -> 2바로 접근이 가능하다. 하지만

names.length 참조형으로 가면 한번 더 쫓아가야 한다.

참조형은 한번 더 쫓아야 한다.

반복문에서 참조형으로 간다면 한 번 더 쫓아야 한다.

그래서 빼놓고 참조 한번 덜 해도 된다.

자주 사용 참조형의 내부의 데이터는 기본적으로 내부의 데이터를 저장해두고 사용하는 것이 효율적이다.

자주 넣어서 사용

 

Stirng [] names = {“리치히”, “고슬링”};

for(int i=0 ; i<names.length ; i=i+1){

           System.out.println(names[i]);

}

 

 

바꾸는 것이 좋다. -> 에러가 있어서 바꾸는 것은 아님

int len = names.length;

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

           System.out.println(names[i]);

}

 

 

len을 기본형 변수에 저장해 놓으면 한 번 저장 후 계속 사용할 수 있지만

참조형으로 가게 되면 반복문 안에서 동일한 참조형의 데이터를 계속 반복한다.

 

기본형에 저장해놓으면 참조를 한 번 덜하게 된다.

자주 사용하는 참조형 내부의 데이터는 기본형으로 저장해두고 사용하는 것이 효율적이다.

 

                      

                       //참조형 내부 데이터를 기본형으로 저장하고 반복문 안에서 기본형의 데이터를 접근

                       //두번째 접근 부터 메모리 접근 횟수가 줄어듬

                       int len = homerunHitters.length;

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

                                  System.out.println(homerunHitters[i]);

                       }

                      

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

                       //빠른 열거를 이용한 접근

                       //데이터의 시작과 끝을 직접 작성하지 않기 때문에 Index오류를 일으키지 않게 됩니다.

                       for(String temp:homerunHitters) {

                                  System.out.println(temp);

                       }

*불필요한 참조문의 사용은 줄이는 게 좋다.

           public static void main(String[] args) {

                       Scanner sc = new Scanner(System.in);

                       System.out.print("출력할 라인 수:");

                       int line = sc.nextInt();

                      

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

                                  for(int j=0 ; j<10 ; j=j+1) {

                                              System.out.print(j);

                                  }

                      

                       }

                                             

                       sc.close();

 

           }

 

 

 

 

 

8.다차원 배열

=>배열의 차원이 2개 이상인 배열

=>배열이 모여서 새로운 배열을 만드는 것

1)2차원 배열 생성

=>초기값을 가지고 생성

배열 요소 1개의  자료형 [][] 배열이름 = {{데이터 나열},{데이터 나열}...}

 

=>메모리 할당을 한 후 나중에 데이터를 채우는 방법

모두 도일한 크기로 생성 :모든 행의 열 개수를 동일하게 생성

배열 요소 1개의 자료형 [][] 배열이름 = new 배열 요소의 자료형[행의 개수][];

배열이름[행번호] = new 배열 요소의 자료형[열의 개수];

배열이름[행번호] = new 배열요소의 자료형[열의 개수];

....

 

2)배열의 데이터 접근

2차원 배열의 경우 데이터 1개 접근 :배열이름[행번호][열번호]

행에 해당하는 배열의 접근:배열이름[행번호]

 

3)length

배열이름.length:행 개수

배열이름[행번호].length:행 벚ㄴ호에 해당하는 배열의 열 개수

 

4)빠른 열거 사용 가능

for(배열요소의 자료형 임시변수:이차원배열){

           각 행에 해당하는 배열이 임시변수에 대입

}

 

5)이차원 배열을 생성하고 인덱스를 이용해서 접근해보고 빠른 열거를 이용해서 접근

                       // 초기 데이터를 가지고 이차원 배열 생성

                       //자료형 [][] 배열이름 = {{데이터 나열},{데이터 나열}...}

                       //String [][] 배열이름 = {{"이종범","윤석민","안치흥"},{"박병호","김하성","이정후"}...}

                       //2차원이면 행열이라고 보면된다.

                       String [][] players = {{"이종범","윤석민","안치흥"},{"박병호","김하성","이정후"}};

                      

                       //인덱스를 이용해서 배열의 모든 데이터 접근

                       //행의 개수를 가져오기

                       int rowCnt = players.length;

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

                                  //각 형 별 열의 개수 가져오기

                                  int colCnt = players[i].length;

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

                                              System.out.println(players[i][j]+"\t");

                                  }

                                  System.out.println("\n");

                       }

                      

                       //빠른 열거를 이용한 접근

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

                       //for(임시변수:Collectioon) {

                       //이차원 배열을 일차원 배열로 접근

                       for(String[] row:players) {

                                  //일차원 배열 내의 데이터를 열 단위로 접근

                                  for(String col : row) {

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

                                  }

                                  System.out.println("\n");

                       }

                      

                       //2차원 배열 중에서 모든 행의 열 개수가 동일하다면 하나의 반복문으로 모든 데이터에 접근 가능

                       //players배열 처럼 모든 행의 열 개수가 3개로 동일하다면 하나의 반복문으로 접근에 가능

                      

                       //전체 데이터 개수를 구한 후 열의 개수를 이용하면 됨

                      

                       //전체 데이터 개수

                       int tot = players.length * players[0].length;

                       //하나의 행에 해당하는 열의 갯

                       int colCnt = players[0].length;

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

                                  System.out.println(players[i/colCnt][i%colCnt] +"\t");

                                  if(i %colCnt == colCnt -1) {

                                              System.out.println("\n");

                                  }

                       }

 

 

3배열 연습문제

1)    1-45까지의 서로 다른 정수를 일차원 배열의 저장 6개 입력받아서

 

 

 

 

int[] ar = {40,37,51,65,29}

합계

개수

평균: medain평균 python에서는

 

 

정렬 :데이터를 순서데로 나열하는 것

1).보기좋게 출력하기 위해서

2).검색을 빨리 하기 위해서

 

배열 제어문

평균 mode->대표값

91 90 92 89 88: 평균 90

100 100 100 100 60 : 평균 90으로 할 수 없다.

생활비:

210 190 180 300 2000

평균 1/4 중앙값 3/4 최대값  차이나는 경우 차이가 많이 나면 조건문 써서 빼야 한다.

python은 참조형만 가능 ->null가능

java, c  기본형 ->null이 안된다. null들어가지 못한다.           nullpointerException

           참조형

AverageSum.java

BasicAlgorithm.java

MinMaxProblem.java

 

2)합계 문제:

1.합계를 저장할 변수를 생성하고 합계를 계산하기 전에 가져야 하는 값으로 초기화

0으로 초기화 조심해야 한다.

계산하기 전으로 가서 데이터 확인 하는게 좋다. 0이 아닐 수 도 있다.

2.합계를 저장할 변수에 합을 구할 데이터를 더해주면 됩니다.

int [] ar = {40,37,51, 65, 29}

int sum = 0;

for (int data: ar){

           sum = sum+ data;

}

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

 

*조건에 맞는 데이터 개수:

1.데이터 개수를 저장할 변수를 초기화

2.조건에 맞는 경우에만 데이터 개수 변수를 1증가

//50이 넘는 데이터의 개수

int cnt = 0;

for(int data:ar){

           if(data > 50){

                       cnt = cnt+1;

           }

}

System.out.println("50이 넘는 데이터 건수:"+cnt);

 

*조건에 맞는 데이터 평균

1.조건에 맞는 데이터의 합계와 개수를 구한다.

2.합계/개수

개수가 0이 나오는것 개수가 0이면 ArithmeticException

10

20

-       ->error

30

정수 /정수는 정수

//30이 넘는 데이터의 평균을 소수 첫째자리에서 반올름

                       //조건에 맞는 데이터 합계

                       cnt = 0;

                       sum = 0;

                       for (int data : ar) {

                                  if (data > 30) {

                                              cnt  = cnt+1;

                                              sum = sum+data;

                                  }

                       }

                      

                       if(cnt ==0) {

                                  System.out.println("조건을 만족하는 데이터 없음");

                       }else {

                                  double avg = (double)sum/cnt;

                                  int result = (int)(avg+0.5);//반올림

                                  System.out.println("평균:"+result);

                       }

 

*최대/최소 ->scalar작업

minmaxScalar standardScalar->표준 정규분포

데이터의 분포가 범위가 다를 경우

최대값으로 데이터를 나누어서 표준화 하기도 함

국어 영우 수학

..............................

이렇게 점수가 있는데 점수분포도가 다를 경우

데이터 표준화 범위 분포 결과는 외곡될 수 있다.

1.최대값

1) 최대값을 저장할 변수를 만들고 배열의 첫번째 데이터나 데이터의 범위 중에서 가장 작은 데이터로 초기화

2) 최대값과 모든 데이터를 비교해서 최대값보다 큰 데이터를 만나면 최대값을 그 데이터로 변경

int max = ar[0]; ->데이터를 모른다면 첫번째 데이터로 초기화한다. 모든 데이터와 비교

                       for (int data : ar) {

                                  if(data > max) {

                                              max = data;

                                  }

                       }

                       System.out.println("최대값:"+max);

 

2.최소값

1) 최소값을 저장할 변수를 만들고 배열의 첫번째 데이터나 데이터의 범위 중에서 가장 큰 데이터로  초기화

2) 최소값과 모든 데이터를 비교해서 최소값보다 작은 데이터를 만나면 최소값을 그 데이터로 변경

문장의 유사도 분석이나 분류및 균집에서 사용 shortest path

거리계산 등 최소값 많이 사용한다.

                       //최소값

                       int min = ar[0];

                       for (int data : ar) {

                                  if(data < min) {

                                              min = data;

                                  }

                       }

                       System.out.println("최소값:"+min);

 

오름차순           내림차순

50에서 가장 가까운 수 찾가

10  13   1  15  21

40  37  51  65  29

{10,30} {20,40} 2차원 배열

{10,10} =>가장 가까운 점

2가지 방법으로 짧은 거리를 찾는다.

1.방법

 

 

 

 

 

 

 

  

 

 

3.배열 연습문제

1)1-45까지의 서로 다른 정수를 6개 입력받아서 일차원 배열에 저장

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

                       Scanner sc = new Scanner(System.in);

 

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

                       int[] lotto = new int[6];

 

                       // 6번 반복

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

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

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

                                  int su = sc.nextInt();

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

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

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

                                              // 이번 입력은 무효

                                              i = i - 1;

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

                                              continue;

                                  }

 

                                  // 데이터 중복 검사

                                  if (i > 0) {

                                              boolean flag = false;

 

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

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

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

                                                         if (lotto[j] == su) {

                                                                     flag = true;

                                                                    System.out.print("중복된 데이터입니다. 다시 입력해주세요\n");

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

                                                                     break;

                                                         }

                                              }

 

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

                                              if (flag == true) {

                                                         i = i - 1;

                                                         continue;

                                              }

                                  }

 

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

                                  lotto[i] = su;

                       }

 

                       // 입력받은 데이터 출력

                       for (int temp : lotto) {

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

                       }

 

                       sc.close();

 

2)합계 문제

                       //합계를 구할 때 합을 저장할 변수를 규칙이 성립되기 전 또는 합을 구하기 전까지의 값으로 초기화

                      

                       int [] ar = {30, 47, 51, 27, 38};

                       int sum = 0;

                       for(int data : ar) {

                                  sum = sum + data;

                       }

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

                      

                       //피보나치 수열

                       //1,1,2,3,5,8,13,21,34,55,89,....

                       //피보나치 수열은 첫번째 와 두번째는 무조건 1 세번째 부터는 이전 2개 항의 합

                       //입력받은 정수의 항 까지 피보나치 수열의 합을 구하시오.

                      

                       Scanner sc = new Scanner(System.in);

                      

                       System.out.print("합을 구할 항의 번호:");

                       int su = sc.nextInt();

                       if(su == 1) {

                                  System.out.print("합은 1\n");

                       }else if(su == 2) {

                                  System.out.print("합은 2\n");

                       }else {

                                  //두번째 항 까지는 규칙이 적용되지 않기 때문에 미리 합계를 구해놓아야 합니다.

                                  sum = 2;

                                  //현재 항의 두번째 이전 데이터를 저장할 변수

                                  int f2 = 1;

                                  //현재 항의 첫번째 이전 데이터를 저장할 변수

                                  int f1 = 1;

                                  //현재 계산될 항

                                  int f = 2;

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

                                              sum = sum + f;

                                             

                                              //현재 피보나치 수열의 값을 계산하는 방법

                                              f2 = f1;

                                              f1 = f;

                                              f = f1 + f2;

                                  }

                                  System.out.print("합은 " + sum);

                       }

                      

                      

                       sc.close();

 

3)최대 최소 문제

                       int [] ar = {30, 47, 51, 27, 38};

                       //위 배열에서 최대값 구하기

                       int max = ar[0];

                       for(int data : ar) {

                                  if(max < data) {

                                              max = data;

                                  }

                       }

                       System.out.print("최대값:" + max + "\n");

                      

                       //위의 데이터 배열에서 40과 가장 가까운 수 찾기

                       //40과의 차이가 최소인 데이터 찾기

                      

                       //첫번째 데이터와 40이 차이 계산하기

                       //차이는 음수가 나올 수 없으므로 음수가 나오면 -1을 곱해서 양수로 만들기

                       int chaMin = ar[0] - 40;

                       if(chaMin < 0) {

                                  chaMin = chaMin * -1;

                       }

                       //차이가 가장 작은 데이터의 값을 저장할 변수

                       int first = ar[0];

                      

                       //데이터 순회

                       for(int data : ar) {

                                  //40과의 차이 계산

                                  int cha = data - 40;

                                  if(cha < 0) {

                                              cha = cha * -1;

                                  }

                                  //차이가 최소인 데이터 찾기

                                  if(chaMin > cha) {

                                              //차이의 최소를 chaMin에 저장

                                              chaMin = cha;

                                              //차이가 최소인 데이터를 fisrt에 저장

                                              first = data;

                                  }

                       }

                      

                       System.out.print("40과 가까운 수:" + first + "\n");

                       /*

                       //두 점 사이의 거리 계산

                       (x1, y1), (x2, y2)

                       =>(x1 - x2)제곱 + (y1-y2)제곱 의 제곱근을 구하는 거리 계산 방법이 있는데 유클리디안 거리

                       =>(x1 - x2)절대값 + (y1 - y2)절대값 의 형태로 거리 계산하는 방법을 맨하탄 거리라고 합니다.

                       */

 

git이용방법

 

**github url

https://github.com/아이디/레포지토리이름

 

github에서 java applicatiaon project가져오기

=>[url]을 복사

=>[File]->[Import]-[git]-[clone a Uri]를 선택

반응형

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

java-6  (0) 2020.09.26
java-5  (0) 2020.09.24
java-4  (0) 2020.09.22
java-2  (0) 2020.09.20
java-1  (0) 2020.09.19
반응형

**Data type

1.overflow & Underflow

1)Overflow 수사 자료형에서 자신이 저장할 수 있는 크기보다 큰 데이터를 강제 형 변환해서 데이터를 저장하는 경우 자신이 저장할 수  범위까지의 데이터만 저장하고 앞쪽의 데이터는 제거하고 저장하는 경우

 

short :2bytes정수로 -32768~ +32767범위 내의 숫자만 저장 가능

short s = 32768//이 구문이 에러

32768->0 10000000 00000000

표현범위가 큰 데이터를 작은 범위의 변수에 저장하기 위해서는 강제 형 변환이 필요

short s = (short)32768;

저장이 되는데 앞쪽을 버린다. 메모리 상에서는 아래 동작이 변한다.

short s = 10000000 00000000(2진수 );

 

System.out.println("s:"+s) //음수가 나온다. -32768

음수 양수는 첫 번째 비트로 확인한다.

0100

1011

+  1

1100

<----------

0100

1100

'

 

+32767 끝까지 왔다가 없으면 -32768로 간다. =>overflow

-32768 하나 빼면 뒤로 갈 수 없어서 32767로 간다.

 

자신이 저장할 수 있는 데이터보다 더 큰 숫자를 저장하면 가장 작은 숫자부터 다시 시작

 

2) Underflow

자신이 저장할 수 있는 숫자보다 더 작은 숫자를 저장하면 가장 큰 숫자부터 다시 시작

 

3)숫자 데이터의 연산에서 결과 자료형보다 더 크거나 작은 데이터가 나오게 되면 잘못된 결과를 만들 수 있습니다.

 

 

#src -> A.java

add -> A.class

 

src=>source의 약자이다.

java파일을 만드는데 class를 어디에 하는가 ?

java start up

python __main__

4)실습

           //자바 애플리케이션의 시작 메소드

           public static void main(String[] args) {

                       // short 32767 보다 큰 숫자는 그냥은 저장 안됨

                       // 강제 형 변환을 통해서만 저장됨

                       // 16비트 앞쪽의 비트는 잘리게 됨 -Overflow

                       // 가장 작은 숫자부터 다시 시작 - 음수가 저장됨

                       // 반대되는 현상을 Underflow라고 합니다.

                       short s = (short)32768;

                      

                       //저장된 데이터를 출력

                       System.out.println("s:"+s);//s:-32768

                      

           }

 

 

 

2.문자열

=>string이라는 클래스를 이용해서 문자열을 저장

=>문자열을 대입할 때는 클래스에서는 예외적으로 직접 값 대입이 가능

sTRING 변수명 = '문자열';의 형태로 생성 가능

 

=>문자열 과 숫자 데이터 또는 BOOLEAN +연산하게 되면 숫자 데이터와 BOOLEAN을 문자열로 변환해서 결합을 합니다.

 

3.Literal저장

=>Literal 사용자가 직접 작성한 데이터

boolean리터럴 :TRUE,FALSE

정수 리터럴 :10(INT) ,10L(long)

실수 리터럴 :3.2f(float),3.2(double),0.314E_001(3.14->0.314 * 10 1)

문자 리터럴 :'A'

문자열 리터럴 :"ABC","A"

참조 리터럴 :null(가리키는 참조가 없다. 결측치)

자료구조 하는 분은 nil이라고 하고 파이썬은 None이라고 한다.

 

문자열은 자기 자신을 더하거나 빼는 것 못한다.

"park" +"moon"

 

park

park+moon

 

이렇게 영규적 영역에 들어간다.

크롤링할 때 항상 파일에 집어연다.

 

stack은 일시적이고  =>지역변수

heap은 없을 수도 있고 영구적일 수도 있다.  =>instance변수 static변수

 

 

 

 

stack 자료구조이름 자료구조를 만드는 메모리 영역

stack 영역 : 함수 또는 메모리가 필요한 데이터 저장

           일시적 함수나 메소드의 수행이 종료되면 소멸된다. return (없어진다.)

heap 영역 : 반영구적  (소멸 가능) * 이 공간을 활용 잘 해야 한다.

static 영역 : (소멸이 안된다.) Method영역 정적

               자동으로 정리하며

            필요해서 하는 것이 아니라 알아서 한다. <->garbage collection(java,python) ->return count

               c는 개발자가 직접해야 한다.

              static영역을 많이 사용하지면 pc가 늦어진다.

              pc꼈다 키면 영구적 영역이 정리해서 속도가 조금 빨라진다.

 

21 -> 0

            -> 1

1).모바일은 upgrade안된다.(최적화)

2).인터넷이 언제 끊어질지 모른다.

 

 

32bit -> 232까지 구분 <- c에서는 주소 ,java 에서는 hash code ,python id

        231 기가

2기가 제한인 것이 많다. 외냐하면 처음 자리는 음수로 해야 한다.

 

int a = 10;

int b = 10;

String name = "park";

static

a,bid가 달라야 하는데 위의 경우 처럼 하면 같다.

 

literal 사용하면 static에 저장

 

10이 있는지 static 에 가서 확인 번지로 찾는다.

10 lteral 한번 받아서 만들어진다.

"park" + "moon" ->최악의 연산이다.

 

 

=>Literal 은 영구적인 영역에 저장

한번 만들어지면 프로그램이 종료될 때 까지 소멸되지 않습니다.

Literal을 변수에 저장하면 먼저 메모리 영역에서 있는지 찾아보고 찾으면 그 참조를 저장하고 찾지 못하면 Literal을 메모리에 저장하고 그 참조를 저장합니다.

 

=>자바에서는 변수가 참조하고 있는 영역을 확인하고자 할 때  System.identityHashCode메소드에 변수를 대입해서 출력해보면 됩니다.

 

실습 :3개의 정수를 저장할 수 있는 변수를 만들고 2개에는 동일한 값을 저장하고 다른 1개에는 다른 값을 저장한 후 해시코드를 출력

                       int a = 10;

                       int b = 10;

                       int c = 11;

                      

                       //a c는 동일한 데이터를 저장했기 떄문에 해시코드가 동일

                       //c는 다른 데이터를 저장했기 떄문에 다른 해시코드를 출력

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

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

                       System.out.println("c:"+System.identityHashCode(c));

 

4.System.out.printf()

=>서식에 맞춰서 콘솔에 출력해주는 메소드

=>프린터 같은 장비는 gui(윈도우) 운영체제를 탑재하지 않고 CLI(cOMMAND Line Interface)기반의 운영체제를 탑재하고 있는데 이런 운영체제에 데이터를 출력할 때는 서식을 이용해서 출력을 해야 데이터에 맞춤을 적용해서 출력할 수 있습니다.

=>java에서는 이 경우 printf메소드를 이용합니다.

1)사용방법

system.out.printf("서식 나열",서식에 매핑되는 데이터를 나열 );

=>서식은 반드시 %로 시작

 

 

2)서식을 보면

정수는 :%d, %i

실수는 %

문자 : %c

문자열 %c

boolean %b

 

3)%다음에 숫자를 입력하면 숫자만큼의 자리를 확보해서 출력

 

4)%0숫자 형태로 입력하면 빈자리는 0으로 채워집니다.

 

5)실수의 경우 %전체자릿수, 소수자릿수 f형태로 출력할 소수 자릿수를 설정할 수 있는데 소수자릿수 아래에서 반올림

 

6)string.format과 사용방법이동일

string.format은 출력하지 않고 문자열로 리턴합니다.

 

int age= 20;

double height = 176.53;

System.out.printf("나이는 %d 키는 %.1f입니다.",age,height);

 

 

**연산자(Operator)

=>연산을 수행하기 위한 부호나 명령어

=>산술 연산은 숫자 데이터의 연산이고 논리연산은 결과가 true false형태로 리턴되는 연산

1. 최우선 연산자

1)() : 괄호 연산의 우선순위 변경을 위한 연산자

2)[]: 배열에서 배열의 크기나 인덱스를 설정할 때 사용하는 연산자

 

2.단항 연산자:하나의 데이터 만을 가지고 연산하는 연산자-Unary(하나만 주기)

 

binary 두개 주기

 

1)증감 연산자 : ++,--

=>변수에만 사용할 수 있는 연산자

=>변수의 앞 뒤 모두에 위치 할 수 있는 연산자

=>변수의 앞에 놓이게 되면 변수의 값을 1증감시키고 명령에 사용

=>변수의 뒤에 놓이게 되면 변수의 값을 명령에 사용하고 1증감시킵니다.

=>연속해서 사용되는 경우 언어마다 다르게 적용

 

int a= 10;

a++;

System.out.println("a:"+a)//11출력

 

 

System.out.println("a:"+(a++));//11 a 12로 바꾼다.

System.out.println("a:"+( ++a));//13 증가시키고 명령

 

a = 0;

int result = ++a + ++a;

System.out.println("result:" +result);// 3

java ->3

c->4

c언어의 특징 : ++a ->1 => ++a-> 2 => 4

java는 하나씩 한다. ++a -> 1

                      ++a ->2

 

                       int a = 10;

                       //a의 값을 1증가

                       a++;

                       System.out.println("a"+a);//11출력

                      

                       //a 11인 상태에서 명령에 먼저 사용하고 1증가

                       //11이 출력되고 a 12가 됩니다.

                       System.out.println("a:" +(a++)); //11

                      

                       //a를 먼저 증가시켜서 13을 만들고 명령에 사용

                       System.out.println("a:" +(++a));//13

 

2)부호 관련 연산자

+ : 양수라는 것을 명시적으로 표현하기 위한 연산자

-  : 2의 보수 연산자 음수 표현

~ : 1의 보수(0->1, 1->0) 연산자 양수와 음수 사이의 절대값 1차이 ,색상 반전에 이용

~ 일 경우 : 01101100 -> 10010011

 

3) 강제 형 변환 연산자

(자료형)데이터 : 데이터의 자료형을 강제로 변경하는 연산자

 

3.산술 연산자

%,*,/,+,1

=>자바는 동일한 자료형끼리 산술 연산을 하면 동일한 자료형으로 결과가 리턴

정수/정수 = 정수

 

=>서로 다른 자료형끼리 산술 연산을 하면 표현 범위가 더 큰 자료형으로 변환해서 연산하고 표현 범위가 더 큰 자료형으로 결과를 리턴

정수 +실수 =>실수 + 실수 =>실수

 

=>int보다 작은 자료형은 int로 변환해서 수행하고 결과도 최소 int

short + short => int +int = int

 

=>문자열은 문자열 또는 숫자,그리고 boolean데이터와 +연산이 가능한데 + 연산을 하게 되면 다른 데이터를 문자열로 변환해서 결합

 

"10+20="+ 10+20 =>"10+20 = 1020"

"10+20="+(10+20) =>"10+20 = 30"

 

=>%:나머지 연산자

숫자의 범위를 제한하거나 패턴을 갖는 문장을 실행할 때 사용

 

실습)패턴을 갖는 명령문을 실행

//빨강, 파랑, 노랑 을 순서대로 1초마다 출력

 

 

순서대로 색갈이나 달력등을 할 수 있다.

2가지 모양이나 4가지 모양으로 하는 게 좋다.

스위치는 2가지 모양으로 하는게 중요하다. on off

                       int i = 0;

                       for(; ; ) {//무한 루프

                                  try {

                                              i = i % 4 ;

                                              if (i == 0) {

                                                         System.out.println("라투");

                                              }else if(i == 1) {

                                                         System.out.println("오미크론");

                                              }else if(i == 2) {

                                                         System.out.println("다크스팩터");

                                              }else {

                                                         System.out.println("오미크론");

                                              }

                                              Thread.sleep(1000);//1초마다 쉰다.

                                              i++;

                                  } catch (InterruptedException e) {

                                              e.printStackTrace();

                                  }

                       }

오미크론이 2개 더 나온다.

 

=>cd Key,나 숫자 코드의 유형성 검사에도 %가 사용됩니다.

다 더해서 /해서 0이면 cd key이다.

주민등록번호는 11의 배수 자리수로 해서 하는 것

 

% , xor =>이미지 연산

 

4.shift연산자

=>정수 데이터를 가지고 왼쪽이나 오른쪽을 비트 단위로 밀어내는 연산자

=>2진수로 연산하고 결과는 10진수로 리턴

=> >>,<<,>>>

 

정수1 >> 정수2  : 정수 1을 정수 2 비트만큼 오른쪽으로 shift

정수1 << 정수2  : 정수 1을 정수 2 비트만큼 왼쪽으로 shift

=>부호비트는 shift하지 않습니다.

첫번째 비트는 shift하지 않습니다.

 

정수 1 >>> 정수 2: 보호비트도 shift포함, 무조건 민다. 그래서 양수 일 때는 >> 와 차이가 없고 음수인 경우 결과가 달라짐

 

=>32번이상 shift하라고 작성하면 32로 나눈 나머지 만큼만 shift합니다.(java) 파이썬과 다르다. 파이썬 계속 밀명 0이다.

 

=>오른쪽으로 한번 shift하면 2로 나눈 효과

=>왼쪽으로 한번 shift하면 2를 곱한 효과

 

4: 0000 0100

 

4 >> 1 : 0000 0010 =>2

4 >> 2 : 0000 0001 =>1

 

5/ 2  => 0000 0101 /2하면 오른쪽으로 하나 민다.  0000 0010 => 2

 

실습)

                      int n = 10;

                       //2번을 오른쪽으로 나누기 4하 효과 - 자가 출력

                       System.out.println("n >> 2" +(n >>2));

                      

                       //32번 이상 밀면 모든 비트가 소멸되기 때문에

                       //32번 이상 shift하면 32로 나눈 나머지 만큼만 shift- 2번만 함

                       System.out.println("n >> 2" +(n >>34));

 

5.옵션 설정

=>프로그래밍 언어에서는 사용할 수 있는 옵션을 정수로 만들어 놓는 경우가 종종 있는데 이 때 숫자의 배열을 확인

=>숫자의 배열이 1,2,3,4,5 처럼 일련번호 형태로 되어 있으면 이 옵션은 하나 만 선택

=>숫자의 배열이 1,2,4,8,16,32처럼 2의 지수 승 형태로 되어 있으면 이 옵션은 중복 선택이 가능한 옵션입니다.

애플은 1,2,4,8이런 식으로 쓰지 않고 1<<0, 1<<1, 1<<2,1<<3형태로 만듭니다.

 

=>키보드 눌렀을 때

A:65, B:66 C:67...

 

마우스 왼쪽 :1 마우스 오른쪽 :2,shift :4, Control : 8  Middle Button:17, Alt ;32..=>중복해서 누를 수 있다.

 

같이 부럴 수 있는 것은

0이면안눌러지고 1이면 눌러진것이고 ->하나의 비트가 하나이 명령을 한다.

control alt 오 왼

0          0  1  1

뭐 눌러짔는 것으로 비교한다.

 

옵션값을 찍어서 확인하기

 

shift는 프로그램언어마다 조금씩 다르다.

 python 32이상시 0으로 채워진다.

 

6.관계 연산자

=>2개의 데이터를 비교해서 결과를  boolean리턴하는 연산자

=>숫자형에만 사용 가능한 연산자 : >,>=,<,<=

=>모든 자료형에서 사용 가능한 연산자 (내용을 비교하는 것이 아니고 가리키고 있는 데이터가 같은지 비교):!= ,

==

=>문자열의 경우는 동일한 데이터이라도 == 로 비교하면 false가 리턴될 수 있기 떄문에 문자열은 == 로 비교하지 않습니다.

 

7.비트 논리 연산자

=>정수 데이터에 사용 가능한 연산자로 비트 단위로 연산한 후 결과를 10진 정수로 리턴하는 연산자

=>&(and): 2개의 비트 모두 1일때 만 1

=>|(or):2개의 비트 모두 0일 때 0

=>^(xor):2개의 비트가 같으면 0 다르면 1

=> 이 연산자들은 시스템 프로그래밍이나 그래픽 프로그래밍을 할 때 자주 등장

 

int a = 20;

int b = 13;

 

a & b

a | b

a ^ b

 

int a = 20;

int b = 13;

 

 

 

 

a: 00000000 00000000 00000000 00010100

b: 00000000 00000000 00000000 00001101

 

 

a&b : 둘다 1일때만 1

00000000 00000000 00000000 0000100  =>4

 

a|b :둘다 0일 때만 0

00000000 00000000 00000000 00011101  => 29   16+8+4+!

 

a^b: 같으면 0 다르면 1 =>exclusive OR

00000000 00000000 00000000 00011002  =>25

 

xor비교 프로그램 만드는 것 하지안으면 값없다.

A ^ 'A' 같으면 0

 

색상 or기법이다.  1 | 1 =>1

 

 

 

and :삭제 and 0 & 0

 

 

or 복사 빈곳

 

잘라내기가 복사하는 것 보다 늦다 그것은 0으로 만들고 해야 한다.

 

 

 

 

왼쪽으로 그림판에서 그리면 오른쪽 처럼 된다.

not xor pen으로 드로쉼

검정색

검정색 xor

검정색              ->0

NOT XOR       -> 1횐색

횐색은 지워지는 것 처름 보인다.

NOT XOR PEN

 

 

 

 

 

이 부분을 white로 바꿔져서 지운것 처럼 보인다.

 

 

control shift        

 

shift를 눌렀는지 확인해서 1인지 확인

0100 5

0101 5

0111 7

1101 13

1111

shift인지 확인

4인지 확인하는 것은 다른것 클릭하면 shift를 눌렀는데 모른다.

 

0000    0000

0100    0100

& 0000  | 0100 =>4

and는 하나라도 0이 있으면 0이다.

&4 window키로

그 자리만 1인 숫자와 andd하면 쉽게 할 수 있다.

: 김상영이 쓴 책

 

 

 

0       0      0      0

        1

if (modifiers == 4) {} ->이런식으로 하면 alt만 누를때만 가능하다. 다른 것은 안된다.

else{}

 

control Alt        

 

0       0      0      0

0       1      0      1 -> ALT+왼쪽

alt + 일 경우 그래서 and 4

특정한 위치의 bit1인지 확인

=>위치의 bit1인 정소와 &를 해서 0이면 0이고 0이 아니면 1

=>윈도우 프로그램안에서 단축키 사용시 중요하다.

방향키 찾아서 하는것 중요한 알고리즘

 

 

                       int a = 20;// 00000000 00000000 00000000 00010100

                       int b = 13;// 00000000 00000000 00000000 00001101

                      

                       // 2개 모두 1인 경우에만 1

                       System.out.println("a & b:"+(a & b)); //결과는 100 ->4

                       // 2개 모두 0인 경우에만 0 나머지 경우는 1

                       System.out.println("a | b:"+(a | b)); //결과는 11101 ->29

                       // 2개 같은 경우는 0 다른 경우는 1

                       System.out.println("a ^ b:"+(a ^ b)); //결과는 11001 ->25

 

8.조건 논리 연산자

=>boolean데이터를 가지고 연산을 수행

=> !(not) :하나의 데이터를 가지고 연산하는데 결과를 반대로 리턴하는 연산자

=> &&(AND):둘다 TURE인 경우만 TRUE를 리턴하고 그 이외의 경우는 FALSE리턴

=> ||(OR) :둘다 FALSE인 경우만 FALSE를 리턴하고 그 이외의 경우는 TRUE리턴

 

=>AND OR는 데이터의 순서를 바꿔도 실행 결과는 같지만 과정은 다를 수 있습니다

 

AND는 앞 쪽의 데이터가 FALE이면 결과가 무조건 FALSE이므로 뒤의 데이터를 확인하지 않습니다.

 

OR는 앞 쪽의 데이터가 TRUE이면 결과가 무조건 TRUE이므로 뒤의 데이터를 확인하지 않습니다.

 

순서에 따라 뒤의 데이터를 확인해야 하기도 하고 확인하지 않아도 되기 때문에 과정이 달라질 수 있습니다.

반복문 안에서 사용할 때는 조금 생각해보고 사용하는 것이 좋습니다.

 

조건 && 예외발생상황

조건 false일 경우 예외발생상황 하지 않는다. 프로그램 정상 상황처럼 보인다.

조건 true일 경우 예외발생상황 한다.

그래서 프로그램이 됬다 안됬다 할 경우 가 생긴다.

&& || 일 경우 확인해야 한다.

null point Exception

 

실습)

                       int x = 10;

                       //x 4 의 배수인지 판별

                       boolean result = ( x % 4 == 0) ;

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

                      

                      int year = 2020;

                       //윤년인지 판별

                       //윤년은 4의 배수이고 100의 배수가 아닌경우 또는 400의 배수인 경우

                       result = year % 4 == 0 &&  year % 100 != 0  ||  ( year % 400 == 0);

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

 

9.삼항 연산자

변수 = boolean이 나오는 표현식 ? true일 때 수행할 내용 :false일 때 수행할 내용;

 

=>2개의 정수가 있다가 할 때 2개 중에 큰 정수 찾기

int a = 10;

int b = 20;

int max = a > b ? a:b;

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

 

=>간단한 분기문을 만들 때는 if대신에 삼항 연산자를 사용합니다.

삼항 연산자로 작성하는 모든 식은 if로 대신할 수 있습니다.

 

10.대입연산자

=: 오른쪽의 데이터를 왼쪽의 변수에 대입하기 위한 연산자

연산자 = : 왼쪽의 변수가 가리키는 데이터에 오른쪽의 데이터를 연산자를 이용해서 연산하고 다시 왼쪽의 변수에 결과를 대입하는 연산

 

int a = 10;

 a+= 20; //a의 값은 10+ 20 을 하고 그 결과를 다시 a에 저장

//a의 값은 30

//+대신에 다른 연산자들도 사용이 가능

 

11.변수의 값을 1증가

a = a+1;

a += 1;

a++;

 

예전에는 a++이 가장 빠르다고 했는데 실제로 비교를 해보면 몇 억번 정도 수행해도 별 차이가 없음

 

a= a+1재일 느리지만 이 방식은 모든 프로그래밍언어에서 사용이 가능 알고리즘에서도 이렇게 사용한다.

+=, ++는 되는 언어가 있고 안되는 언어도 있습니다. 알고리즘에서 사용이 안된다.

 

12.연습문제

int second = 309209;

//second에 추가 저장

//하루는 86400, 1시간은3600, 1분은 60

//second가 몇일 몇 시간 몇분 몇초인지 출력

 

                       int second = 309209;

                      

                       int day = second / 86400;

                       int hour = (second - (day* 86400))/ 3600;

                       int minute =(second - (day* 86400)- (hour*3600))/60;

                       //초는 분 까지 가져 간 것을 모두 뺴면 되는데 일,시간, 분은 전부 60의 배수이기 때문에

                       //60으로 나눈 나머지가 몯  뺀 값이 됩니다.

                       int sec = second% 60;

                      

                       System.out.println(day+"" +hour+"시간"+minute+"" +sec+"");

 

13.자바에서 콘솔에서 입력받기

Scanner sc= new Scanner()

//Scannerjava.util.Scanner 라서 그냥 Scanner라고 쓰면 에러가 나는데

//Scanner글자에 마우스 커서를 갖다 대면 import 를 대신 해준다고 메시지가 출력됩니다.

//크릭하면 import를 해줍니다.

 

//문자열을 입력받고자 하면

문자열 변수 = sc.nextLine();

 

//정수 입력받고자 하면

정수변수 = sc.nextInt();

 

실습 )

이름과 나이를 입력받아서 출력

이름은 문자열 나이는 정수

 

                       //이름과 나이를 입력받아서 출력하기

                       //키보드 인식 하는 것 System.in

                       Scanner sc = new Scanner(System.in);

                      

                       //이름을 입력하기

                       System.out.print("이름 입력:");

                       String name = sc.nextLine();

                      

                       //나이를 입력받기

                       System.out.print("나이 입력:");

                       int age = sc.nextInt();

                       //확률이 높은 것을 위에 올려준다.

                      

                       //출력

                       System.out.println("이름은 "+name+" 나이는 "+age);

                      

                       sc.close();//없으면 경고가 생긴다.Resource leak

                       //leak 있을 경우 close해주면 된다.

 

14.제어문자

=>역슬래시 다음에 하나의 영문 문자를 기재해서 특별한 기능을 수행하도록 한 문자

\n:   줄 바꿈

\t: 

\\ : 역슬래시

\' '

\"": "

 

\a : 비프음 -C언어 같은 언어에서는 메인보드 내의 스피커를 이용해서 beep음 출력

java에서는 안된다.

컴퓨터 킬때 나는 소리

없으면 메인보드 스피커 빠진것이다.

원도우 프로그래밍을 하다가 버튼의 제목 같은 곳에서 줄바꿈을 할려고 했는데 \n으로 안되면 \r\n을 이용

\n는 줄 만 바꾸고 커서를 움직이는 것이 아니다.

\r은 커서를 맨 앞으로 보내는 것이다.

 

**제어문(Control Statement)

=>프로그램의 흐름을 변경하는 명령어

=>프로그램은 왼쪽에서 오른쪽으로 위에서 아래로 순서대로 처리되는데 이러함 흐름을 변경하는 명령어

1.종류

1)분기문

=>조건이나 값을 가지고 분기(갈림길)

ifswitch

 

2)반복문(Loop)

=>동일한 패턴의 문장을 반복 수행

while, do ~ while ,for

 

3)기타 제어문

break ,continue, return

 

2.if

1)단순 if

if(boolean데이터 또는 boolean이 리턴되는 표현식 또는 메소드 호출){

           ()안의 내용이 true일 때 수행할 내용

}

 

2)if ~ else

if(boolean데이터 또는 boolean이 리턴되는 표현식 또는 메소드 호출){

           ()안의 내용이 true일 때 수행할 내용

}else{

           ()안의 내용이 false일때 수행할 내용

}

 

3)if ~else if ~ else

if(boolean데이터 또는 boolean이 리턴되는 표현식 또는 메소드 호출){

           ()안의 내용이 true일 때 수행할 내용

}else if(새로운 비교내용){

           앞의 조건이 false이고 ()안의 조건이  true일 때 수행할 내용

}else{

           ()안의 내용이 false일때 수행할 내용

}

=>else if는 무제한 사용이 가능

=>else는 생략이 가능

 

 

실습 1)

=>점수를 입력받아서 60점이 넘으면 합격이라고 출력

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

                       Scanner sc = new Scanner(System.in);

                      

                       //점수 입력받기

                       System.out.print("점수 입력:");

                       int score = sc.nextInt();

                      

                       //점수가 60점 이상이면 합격이라고 출력

                       if(score >= 60) {//조건

                                  System.out.println("합격"); //수행할 내용

                       }

                      

                       sc.close();

         

 

실습 2)

=> 점수가 60점 이상이면 합격이라고 출력

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

                       Scanner sc = new Scanner(System.in);

                      

                       //점수 입력받기

                       System.out.print("점수 입력:");

                       int score = sc.nextInt();

                      

                       //점수가 60점 이상이면 합격이라고 출력

                       if(score >= 60) {//조건

                                  // 조건이 true 일때 수행할 내용

                                  System.out.println("합격"); //수행할 내용

                       }else {

                                  //조건이 false일때 수행할 내용

                                  System.out.println("불합격"); //수행할 내용

                       }

                      

                       sc.close();

 

 

실습3)

90-100이면 A

80-90미만이면 B

70-80 미만이면 C

60-70미만이면 D

0~60미만이면 F

=>자바는 위의 조건이 아래 조건을 포함하면 에러가 발생

=>결코 도달할 수 없는 코드를 만들면 에러가 발생

문법적인 오류 없지만 로직 오류는 에러 가 발생한다.

if(score >= 0 and score <= 100){

}else if (score >= 10 and score <= 100){

}

=>이런 경우 else의 용도도 고민해봐야 한다.?

else는 예외적인 상황 발생에 대한 처리를 해주는 것이 좋습니다.

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

                       Scanner sc = new Scanner(System.in);

                      

                       //점수 입력받기

                       System.out.print("점수 입력:");

                       int score = sc.nextInt();

                      

                       /**

                        * 점수가 90-100    이면 A

                        * 점수가 80-90 미만이면 B

                        * 점수가 70-80 미만이면 C

                        * 점수가 60-70 미만이면 D

                        * 점수가   0~60 미만이면 F 라고 출력

                        */

                       if(score >= 90 && score <= 100) {

                                  System.out.println("A");

                       }else if(score >= 80 && score < 90) {

                                  System.out.println("B");

                       }else if(score >= 70 && score < 80) {

                                  System.out.println("C");

                       }else if(score >= 60 && score < 70) {

                                  System.out.println("D");

                       }else if(score >= 0 && score < 60) {

                                  System.out.println("F");

                       }else {

                                  System.out.println("잘못된 점수 입력");

                       }

                       //else는 예외적인 상황 발생에 대한 처리를 해주는 것이 좋습니다.

                      

                       sc.close();

 

 

3.switch

=>값에 의한 분기

switch(정수나 문자열 변수 또는 연산식 그리고 메소드 호출){

           case 1:

                       ()안의 내용이 값1일때 수행할 내용;

                       (break;)

           case 2:

                       ()안의 내용이 값2일때 수행할 내용:

                       (break;)

           ................

           default:

                       일치하는 값이 없을 때 수행할 내용;

                       (break;)

}

 

=>문자열은 자바 1.7버전부터 지원

=>case옆에 작성하는 값은 리터럴이거나 final변수 이어야 합니다.

변수를 만들 때 자료형 앞에 final,을 기재하면 자바에서는 literal이거나 읽기 전용 변수(상수)가 됩니다.

=>case구문안에서 break를 생략하면 break를 만날때 까지 모든 문장을 전부  수행

 

실습)

정수를 1개 입력받아서 1이면 한식 2이면 중식 3이면 분식 나머지 경우는 일식이라고 출력

값을 가지고 분기하는 경우인데 if로 작성이 가능하지만 값에 따라 다른 문장을 실행할 때는 switch를 사용하는 것을 권장

특정한 값일 때 무엇이다

ifswitch보다 빠르다.

                       Scanner sc = new Scanner(System.in);

                      

                       // 매뉴 입력받기           

                       System.out.print("메뉴 입력(1-한식 2-중식 3-분식 기타-일식)");

                       int menu = sc.nextInt();

                      

                       switch(menu){

                       case 1:

                                  System.out.println("한식");

                                  break;

                       case 2:

                                  System.out.println("중식");

                                  break;

                       case 3:

                                  System.out.println("분식");

                                  break;

                       default:

                                  System.out.println("기타 - 일식");

                                  break;

                       }

                      

                       sc.close();

 

//마우스 왼쪽 누르면

case 1:

final int LBUTTONGDOWN =1;

case LBUTTONGDOWN:

                       Scanner sc = new Scanner(System.in);

                      

                       // 매뉴 입력받기           

                       System.out.print("메뉴 입력(1-한식 2-중식 3-분식 기타-일식)");

                       int menu = sc.nextInt();

                      

                       //읽기 전용의 변수를 생성

                       final int KOREA = 1;

                       final int CHINA = 2;

                       final int SNACKBAR = 3;

                      

                      

                       switch(menu){

                       case KOREA:

                                  System.out.println("한식");

                                  break;

                       case CHINA:

                                  System.out.println("중식");

                                  break;

                       case SNACKBAR:

                                  System.out.println("분식");

                                  break;

                       default:

                                  System.out.println("기타 - 일식");

                                  break;

                       }

                      

                       sc.close();

읽거나 할경우 case안에 final로 한 읽기전용으로 하는게 훨신 보기 좋다

실행은 소스 코드 크기로 하는 것이 아니다.

if보다 switch가 빠를 가능성이 높다.

 

li = [1,2,3]

dic = {"":1 ,"":2, "":3}

key: 해싱해서 저장

value [1,2,3]

특정값기능이 안된다. 실수 ,판단

li[0]  li[1]  li[2]          =>전체 조회시 데이터 적을 때 빠르다.

원래 자리 돌아갔다가 다시 다음것 진행

    pointer

첫번째 찾고 돌아갔다가 다시 다음 것 진행한다.

for in 갔다가 대기한다음 다음 위치로 이동

 

dic[""] dic[""] dic[""] =>속도가 더 빠르다.

           변수는 여러개의 데이터 가르킬 수 없다.

li 출발점은 출발전 가르킨다.

    pointer

li[1] ->li찾아서 한칸 건너뛴다. =>2

li[2] ->li찾아서 두칸 건너뛴다. =>3

데이터가 많으면 많을수록 속도가 점점 늦어지낟.

숫자는 건너뒤는 것이다.

dic->이름 쓰면

key :해싱해서 저장

hash 함수

                                                        

                                                        

                                                          

dic[""]

dic[""]

 

if

 

 

 

 

 

 

밑에 조건은 위에서 걸쳐야 한다.

switch -case 는 바로간다.

smart phone은 바로간다. dict 이런 방식

해싱한다.

if < switch

1.     코드의 가독성이 높다.

2.     여러번 수행하면 수행속도가 빠르다.

for in 다음위치

읽고 기다ㄹ기고 진행

random접근이 안된다. 전진 밖에 안된다.

 

 

4.반복문

=>패턴을 갖는 문장을 연속적으로 사용해야 하는 경우 반복문을 사용할 수 있습니다.

1)while

while(boolean 데이터 또는 boolean이 리턴되는 연산식 또는 메소드 호출){

           ()의 값이 false가 아닐 때 수행할 내용;

}

 

//Hello Java3번 출력->속도는 이것이 빠르다.

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

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

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

 

int i = 0;

while (i < 3){

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

           i = i+1;

}

 

일반적인 프로그램은 0부터이고

프로그램이 아닌 분들 시작하는 것은 rdb1부터 만들어진것이다.

int i = 0;

하면 몇 번 까지 했는가 할때 편하다. 마지막에 .i를 출력하면 3이다.

알고리즘을 할때는 보통 1이다.

 

3

2

1

 

(3- (i++))

--빼기 잘 안쓴다.

 

2)do ~while

do {

           반복 수행할 내용;

}while(조건);

=>무조건 반복 수행할 내용을 하고 조건을 확인해서 false{}아ㄴ의 내용을 반복

=>do ~while while로 변경할 수 있지만 반드시 1번은 수행해야 한다. 라는 의미를 전달하기 위해서 사용

i = 0;

do {

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

           i = i+1;

}while(i < 3);

 

3)for

for(처음 한번만 수행할 내용; 조건; 두번째 부터 수행할 내용){

           조건이 false가 아니라면 수행할 내용;

}

=>각 영역은 생략이 가능

for(;;){} //무한 반복false가 아니라면 수행해야 하기 때문에

=>각 영역은 생략이 가능

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

           System.out.println("Hello Java")

}

 

int i = 0;

for (; i <3 ; i= i+1){ //처음에 안하겠다.

           System.out.println("Hello Java")

}

 

//첫번 째 것은 한번만 하는 것이다.

for (int i = 0, int j = 0; i <3 ; i= i+1){ //처음에 안하겠다.

           System.out.println("Hello Java")

}

 

4.제어문을 사용할 때 주의할점

if switch,while,for를 쓸 때 주의할 점은 ()뒤에 ; 을 하는 것이다.

()뒤에 ; 을 하게 되면 조건은 무시하고 {}안의 내용을 무조건 한 번만 수행합니다.

 

실습 -반복문 while, do~while, for로 만들기

                       //while

                       //한번만 수행할 내용 -> while(조건) -> { }내에 반복수행할 내용

                       int i = 0;

                       while(i<3){

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

                                  i = i + 1;

                       }

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

                       //do~while

                       //한번만 수행할 내용 -> do{반복 수행할 내용} -> while(조건);

                       i = 0;

                       do {

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

                                  i = i + 1;

                       }while(i<3);

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

                       //for

                       //for(한번만 수행할 내용; 조건; 두번째부터 수행할 내용){반복 수행할 내용}

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

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

                       }

**java applicationgit hub 에 올리고 내려받기 그리고 업데이트

 

1.    올리기

1)git hub 사이트에서 repository1개 생성하고 url을 복사

 

 

2)Eclipse에서 git perspective->open perspective->other->[git]

3)clone a git repository -를 클릭하고 복사한 URLURL란ㄴ에 입력하고 NECT를 눌러서 마침

=>화면에 REPOSITORY가 생성

복사하면 자동으로 복사가 된다.                 

 

 

4)하면을 다시 자바화면으로 변경

5)업로드 하고 싶은 프로젝트를 선택하고 마우스 오른쪽은 클릭한 후 [TEAM]-[ SHARE PROJECT]를 선택

 

6)대화상자에서 업로드 하고 싶은 REPOSITORY를 선택한다.

현재 프로젝트를 LOCAL에 있는 GIT과 연결한 것임

 

7)프로젝트 GIT HUB사이트에 업로드

COMMIT AND PUSH ->LOCAL 하고 서버

COMMIT->LOCAL에만  

PUSH ..서버에

프로젝트를 선택하고 마우스 오른쪽 을  클릭하면 [TEAM] -[COMMIT]

대화상자에서 변경된 파일들을 아래로 드래그

MESSAGE를 작성하고 COMMIT AND PUSH클릭하면 GIT HUB에 업로드

COOMIT을 누르면 로컬에만 반영

 

 

 

 

 

반응형

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

java-6  (0) 2020.09.26
java-5  (0) 2020.09.24
java-4  (0) 2020.09.22
java-3  (0) 2020.09.20
java-1  (0) 2020.09.19
반응형

pjava programming

1. java application programming - java문법, DataParsing(HTML,JSON, XML),자료구조

2.java web programming –jsp &servlet, html,css,javascript

3.java framework –db (mybatis& hibernate),spring

 

객체지향

C++ C # OBJECT-C 함수형 + 객체지향

PYTHON

CLASS안해도 할 수 있다. 객체지향을 사용하지 않았다.

JAVA OBJECT-C에서 나왔다.

JAVA는 완전한 객체지향언어 이다.

객체지향에  함수를 나중에 추가했다.

함수형은 좀 가볍다.

객체지향은 어렵다.

C++, C#, OBJEC-C, PYTHOn등을 말하기 위해서는 실행파일을 해야한다.

WINDOW MAC은 자기들이 해석할 수 있다.

운영체제

실행파일은 ASSEMBLY LANGUAG로 만들어야 한다.

실행파일 두 개씩 만들어야 한다.

가정용품에서 문제가 생긴다. 그래서 Linux 1.0->linux 2.0에서 만들려면 계속 바꿔야 한다ㅏ.

운영체제에 따라 바꾸지 않고 하기 위하려고 해서 플랫폼 독립적인 언어

java os위에다 jvm을 만들고 거기서 인식하는 것을 만든다.

jvm이 알아서 os가 적용할 수 있는 것을 만든다.

 

 

 

 

 

 

java                 kotlin ->안드로이드(google)

scala ->big dada spark설치 등 해야 한다.

clousre ->lambda sever

3 compiler하면 java class로 한다.

Go lang(google 이 만든 것)

windows 7 .net

j2ee->eclipse

j2se ->licence

j2me->iot embedded

java  개발도구 (jdk)->자바에서 제공하는 클래스모임 , 실행하기 위한 jvm

      실행도구 (jre)=>R,python ->jvm

 

**java  개발 도구 설치

1.oracle에서 회원가입을 하고 jdk를 다운로드 받아도 되고 open jdk를 다운로드 받아서 설치해도 됩니다.

=>회사에서 application 개발을 할 때는 open jdk를 받아서 하던가 오라클 계약을 하고 oracle jdk를 다운로드 받아서 개발

open jdk=>회사에서는 open jdk사용하면 된다.

 

=>se버전을 다운로드

피씨 포맷할 경우 .net하고 java설치 하기

개발도구 하고 실행도구

 

2.다운로드 받은 프로그램을 설치

=>개발도구인 jdk와 실행도구인  jre가 같이 설치가 됩니다.

디렉토리 잘못 되면 안될 가능성이 있어서 환경변수 하면 좋다.

mac은 개발관련한것은 자기가 관리자 권한으로 설정해서 paht 에 연다.

하지만 linux,windows는 자기한테 간다 .관리자가 아니여서 환경변수 설정하는게 좋다.

 

3.환경 변수 등록

1).path:명령어를 입력했을 때 명령어를 찾는 디렉토리에 관련된 환경 변수

=>명령어를 짧게 사용하기 위해서 등록

=>java에서는 jdk디렉토리의 bin이라는 디렉토리를 등록

=>대다수의 프로그램들은 bin이라는 디렉토리에 명령어들이 모여 있습니다.

 

2)classpath:

=>자바 프로그램이 클래스를 찾는 기본 위치를 설정

=>설정하지 않으면 현재 작업 디렉토리에서 먼저 찾고 rt.jar에서 찾습니다.

=>설정하지 않아도 됩니다.

 

3).jre_home

=>자바로 만들어진 프로그램이 사용할 jre위치를 설정

=>java버전이 하나만 설치된 경우는 설정하지 않아도 자바로 만들어진 프로그램이 찾아서 설정합니다.

=>2개이상이 설치된 경우라면 설정하는 것이 좋습니다.

 

4.path설정

1)jdk가 설치된 디렉토리의 bin이라는 디렉토리 경로를 복사

=>python 이나 anaconda설치 할 때 path설정을 실수로 안 한 경우에도 동일한 방법으로 설정

C:\Program Files\Java\jdk1.8.0_231\bin

 

2)탐색기에서 [ pc] [내 컴퓨터]를 선택하고 마우스 오른쪽 [속성]을 선택

 

3)왼쪽 화면에서 [고급 시스템 설정]을 선택

 

4)새로운 대화상자에서 [환경 변수]클릭

 

5)2개로 나누어진 창이 보이게 되는데 위의 창은 현재 로그인 유저에 관련된 설정이고  아래 창은 모든 유저에서 적용되는 설정입니다.

위나 아래에서 path라는 환경 변수를 찾아서 [편집]을 클릭

 

6)새로 만들기를 누르고 이전에 복사한 내용을 붙여넣기 하면 됩니다.

=>windows7일 때는 하나의 문자열로 보이는데 이 때는 커서를 맨 뒤로 이동하고 ;을 추가하고 붙여넣기를 하면 됩니다.

이전에 입력된 내용을 삭제하면 이전 설정된 내용이 없어지므로 주의해야 합니다.

 

5.java설치 확인

1).실행 도구 설치 확인 (jre확인 )

=>command창에서 java –version을 입력하고 enter

 

2)개발 도구 설치 확인

=>command창에서 javac –version을 입력하고 enter

=>설치가 되도 안보이는 경우가 있는데 이 때는 path 설정을 하지 않아서 입니다.

 

6.자바 코딩 및 실행

1)코딩은 문서만 만들 수 있는 프로그램이라면 어떤 것이든 상관 없습니다.

=>자바코드 파일의 확장자는 .java로 만들면 돕니다.

 

2)컴파일 명령

=>javac파일명

=>파일명은 전체 경로를 입력해야 하고 확장해도 포함해야 합니다.

=>성공하면 확장자명을 제외한 파일명.class가 생성됩니다.

=>이 파일이 jvm 위에 올라가면 다시 실제 어셈블리어로 번역되서 실행

 

3)실행명령

=>java 클래스이름

=>확장자를 제외한 클래서 이름만 입력

=>반드시 main메소드를 소유한 클래스 이름을 입력해야 합니다.

 

**자바 프로그램의 실행 원리

소스 프로그램(코딩한 내용)->compile(소스 프로그램을 어셈블리 언어로 변역 컴파일에 실패하면 문법에 맞지 않게 작성한 것입니다. 문법을 확인해야 합니다.): java .class파일 을 생성->build(여러 개의 파일들의 실행 순서와 스타트업 코드를 삽입해서 실행되기 직전의 프로그램을 만드는 것입니다. – 빌드에 실패하면 실행하는 메소드가 없거나 2개 이상이거나 하는 등의 구조적인 문제입니다.)

운영체제는 어셈블리 언어로 한다.

python등은 main 이 있어야 한다.

load(프로그램을 메모리에 적재)->run(실행)

 

7.IDE(통합 개발 환경-Integreated Development Environment)

=>컴파일과 실행하는 명령어 들을 직접 입력하지 않고 단축키나 아이콘 등으로 수행할 수 있도록 해주는 개발 관련 프로그램

 

 

=>python IDE idle,pycharm,jupyter notebook, spyder, vscode

,jupyter notebook ->분석하고 보고서 만드는 것이 편하다.

vscode ->개발자

pycharm ->가상환경

=>Java IDE Eclipse(무료- 공공기관,금융,대기업이 Eclipse기반의 Framework를 사용) Intelli J(코드 센스 기능 및 코드 최적화 기능이 Eclipse에 비해서 뛰어남, 무료 버전으로는 일반 application개발과 안드로이드 만 가능 ,사용화 버전을 구매해야만 웹 프로그래밍이 가능, 학생은 상용화 버전이 무료, 스타트업이나 중견기업에서 주로 이용)를 많이 사용

 

 

 

프로그램 만든다.

실행속도는 c가 빠르다.

개발 시 leaning curve(언어 습득시간)

        coding

 

8.Eclipse설치

=>www.eclipse.org 에서 다운로드

https://www.eclipse.org/downloads/download.php?file=/oomph/epp/2018-12/R/eclipse-inst-win64.exe&mirror_id=448

=>설치 과정에서 유의할 점은 맨 처음 버전 선택 하는 부분입니다.

java web programming까지 할려면 java ee버전으로 설치

eclipse IDE for java developers=>java밖에 안된다.

 

프로그램을 해석해주는 것

프로그램 IDE -->프로그램 만드는 것이 아니다.

ANACONDA는 두개 다 있다.

 

9.프로그램 작업 단위

1) workspace:디렉토리의 개념

=>환경 설정과 프로젝트가 같이 저장

 

2).project:실행 단위

=>여러 개의 패키지와 파일이 같이 저장

 

3)package:파일들을 보기 좋게 정리하기 위해서 만드는 단위

=>여러 개의 파일이 같이 저장

 

4)file:소스 코드 작성 단위

 

5)workspace를 변경하면 환경설정을 다시 해야 합니다.

 

10.Elicpse환경설정

=>windows에서는 windows메뉴의 preference

mac에서는 첫번째 메뉴의 preference

 

11.java application projecT(운영체제에 설치해서 실행되는 프로그램)만들기

1).File – [New] – [Project]

=>java Project 를 선택

=>화면에서 보이지 않을 때는 [Others]를 선택하고 [Java]탭에서 [Java Project]를 선택

 

베타테스트 ->다른 곳에서도 테스트 해본다.

src->java파일 실행하는 디렉토리

.java 컴파일 하면 .class로 되서 실행된다.

.java->src

.class->bin

 

2)프로젝트 이름을 입력하고 저장 위치를 정하는 대화상자를 출력

 

3)next를 누르면 소스 파일과 클래스 파일의 위치를 정할 수 있는 대화상자를 출력

디폴트는 소스 파일은 src 클래스 파일은 bin으로 설정되어 있습니다.

변경하지 않습니다.

 

4)자바는 완전한 객체 지향 언어라서 최소한 1개 이상의 클래스가 있어야 실행이 됩니다.

=>클래스를 생성할 떄는 src 디렉토리 위에 마우스를 올려놓고 마우스 오른쪽을 클릭하고 [New] – [Class]를 선택하고 클래스 이름과 옵션을 설정

=>클래스를 만들 때 main메소드를 소유한 클래스가 실행이 가능한 start up class가 됩니다.

=>클래스 이름은 대문자로 작성하는 것이 관례입니다.

대문자로 만드면 class이다. 그래서  python 에서는 dir 확인 필요

 

 

 

5)main메소드 안에 작성

System.out.println("안녕하세요 처음 만드는 자바 프로그램입니다.");

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

 

 

6)실행

[Run] –[Run]

=>하단에 콘솔이 하나 만들어지고 결과를 출력합니다.

 

12.Eclipse화면

=>조그마한 화면 하나는 View라고 하고 전체적인 구조는 Perspective 라고 합니다.

Eclipse에서는 Perspective 에 따라 메뉴가 달라집니다.

=>조그만한 화면이 안 보이는 경우에는 [Window] –[Show View]메뉴를 이용해서 출력하면 됩니다.

=>메뉴가 다르거나 화면 전체 구성이 다르면 [Window]-[ Perspective]-[Open Perspective]에서 원하는 구조를 선택하면 됩니다.

상단의 메뉴바 가장 오른쪽에서도 가능합니다.

 

13.System.out.println(),system.out.print,System.out.printf,out대신에  err사용

=>콘솔에 내용을 문자열로 출력해주는 메소드

System.out.println() 은 메소드를 출력할 때 마다 출력하고 마지막에 줄 바꿈을 해줍니다.

 

System.out.print는 호출할 때 출력하지 않고 모사어 한꺼번에 출력하고 줄 바꿈을 하지 않습니다.

 

System.out.printf는 서식을 적용해서 출력하고자 할 때 사용

콘솔용 프로그램을 만들 때 출력을 보기좋게 할 때 주로 이용

 

out대신에 err을 사용하면 콘솔에 에러가 발생한 것처럼 빨간색으로 출력

프레임워크 같은 곳에서는 자체적으로 출력하는 메시지들이 있기 때문에 구분하기 위해서 사용

System.err.println("Hello world");

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

System.out.print("Hello world");

 

14.프로그램의 구성

1).keyword(예약어)

=>프로그래밍 언어가 기능을 정해놓은 명령어

 

2).identifier(식별자)

=>프로그래머가 다른 것 들과 구분하기 위해서 만든 이름

=>예약어를 식별자로 사용하면 에러

=>이미 만들어진 식별자를 새로운 기능으로 재정의하면 기존 식별자의 기능은 소멸되고 프로그램에서는 새로운 기능으로만 사용이 가능합니다.

python에서는 def 는 예약어이다.

def = 10 ->오류난다.

str->식별자이다.

str = 100 (str은 문자열이지만 이 프로그램을 사용하는 동안은 str 100이 된다. )

=>영문과 한글 모두 가능하고 숫자도 가능하면 일부 특수문자도 가능

=>시작은 반드시 문자로 해야합니다.

=>중간에 공백은 안됩니다.

=>JAVA에서는 카멜 표기법을 권장하는데 변수와 메소드는 소문자로 시작하고 클래스는 대문자로 시작하고 상수는 모두 대문자로 표기

2개 이상의 단어로 구성된 경우는 두번째 단어의 시작도 대문자로 합니다.

 

PYTHON: 기본제공이 적다. 예약어가 적다. 다른 개발자가 제공하는 기능이 많다.

문법 ->예약어

 

3).literal

=>사용자가 직접 작성하는 데이터

=>숫자는 숫자만 표현, 하나의 문자는 'c'형태로 표현 ,여러개의 문자는 "문자열" , 참과 거짓은 TRUE,FALSE로 표현하고 NULL NULL이라고 표현

 

4).variable

=>변수 데이터를 저장해두고 다음에 사용하기 위해서 붙인 이름

 

5).constant

=>상수 데이터를 저장해두고 읽기 전용으로 사용하기 위해서 붙인 이름

 

6).operator

=>연산자 연산을 위해서 사용하는 부호나 명령어

 

7).method

=>객체 지향언어에서 작업을 수행하는 단위

=>function(함수)라고도  하는데 함수는 아무곳에서나 사용할 수 있는 것이고 메소드는 객체나 클래스를 이용해서만 호출이 가능

 

8).class & object(instance)

=>관련있는 변수와 메소드의 집합

 

9).package

=>관련있는 클래스의 집합으로 배포 단위

 

10).comment

=>주석

=>컴파일러에 의해서 번역되지 않는 문장

=>한줄은 //다음에 작성

여러 줄은 /**/안에 작성

 

Data Type(자료형)

=>데이터를 얼마만큼의 크기에 어떻게 저장하고 읽어낼 것인가 하는 것

1.분류

1)정적 자료형 과 동적자료형

정적자료형 (Static) 선언할 때 결정->속도가 더 빠르다.

동적자료형(dynamic) 실행할 때 결정 runtime->효율은 좋을 가능성이 높다.

int a = 10;->정적 a를 선언하는 순간 정수를 정한다. 바꿀 필요 없다.

int a = 10.7->오류난다. 안된다.

a = 10;->동적이다. a는 뭐 저장할 지 모르지만 10을 주는 순간 정수가 된다.계속 바뀐다.

a = 10.7 ->float으로 된다.

 

2)변경가능성에 따른 분류

documnet에는

1)mutable(변경가능) ->variable(변수)

2)imutable(변경 불가능)->constant(상수) -> readonly ->

예약어 int A = 10

                                                         예약어 붙이면 constant, readonly

                                                         읽기 전용은 프로그램의 가독성 문제이거나 multithread때문에

           : 잔액조회시 constant하지 않으면 누군가가 바꿀 수 있다.

                                                         literal->사용자가 직접 작성한 데이터

                                                                     10 , 10.7 , a

데이터 가공

R은 자기것 안바꾸고 return한다. 항상 새로운 것에 복사해서 작업해서 바꾼다.

python은 프로그래밍 언어이기 때문에 보통 자기 자신을 바꾼다.그래서 분석인지 아닌지 확인해야 한다.inplace = true 자기 자신 바꾸는 것이고 설정하지 않으면 return한다.

 

3)데이터 개수에 따른 분류 ->데이터 분석시

(1).scala data :데이터 1변수가 데이터 자체를 의미

(2).vector data:0 개 이상의 데이터 변수가 데이터가 위치한 곳의 참조가 되는

 a = 10 ->a 10

li = [10,20] ->시작 위치를 가리킨다. 참조 .이나 이런 것 해서 찾아야 한다. li[0]

분석에서는 1개이나 0개 이상이냐는 매우 중요한 것이다.

 

4).사용 방식에 따른 분류->java ->데이터 프로그램

(1). value type (기본형) : 변수 자체가 데이터

변수는 절대 값을 저장 할 수 없다.

(2)reference type(참조형):변수가 데이터 저장된 곳에 참조를 의미 ->javascript(정적을 자료를 선언하지 않는다.)

javascript var =

            lef

a = 10->reference type

reference메모리의 주소를 카르킨다. 크기가 같다.

value는 가르키고 있는 주소가 정해져 있어야 한다. 그래서 자료형을 쓴다.

 

주소는 (assembly)등에 서 사용하기 때문에 따른데는 주소라고 할 수없다. 가상의 주소 가르킨다. 참조라고 하는게 좋다.

a = 10

a = 10.9

변수의 크기는 주소를 가르킨다.

32bit머신은 4g가 이상 사용할 수 없다.

실제로는 1나는 value, reference인지 확인 해야 한다. 그래서 2 31승이다.

 

 

**자료형(Data Type)

1.java에서 일반적으로 자료형을 구분하는 방법

1).value type(기본형):변수가 데이터 자체를 의미하는 것

=>8가지의 자료형이 제공

=>boolean,byte, short, char, int,long, float, double

 

2)reference type(참조형):변수가 데이터의 참조를 의미하는 것

=>배열,클래스(객체)

 

2.java에서 변수 선언

자료형 변수이름:

=>기본형인 경우는 이름만 만들어지고 참조형인 경우는 변수이름이 만들어지고 공간할당을 한후  null을 저장

 

3.변수가 가리키는 공간에 값 대입

변수이름 = 데이터;

=>이 때 데이터는 변수가 선언될 때와 동일한 자료형의 데이터만 가능

=>선언과 동시에 값 할당 가능

자료형 변수이름 = 데이터;

 

4.java는 명령어 종료할 때 마다 ;을 해야 합니다.

 

5.변수는 선언할 때와 = 의 왼쪽에 있을 때는 공간을 의미하지만 그 이외의 경우는 데이터나 데이터의 참조를 의미합니다.

 

int a = 10; //선언할 때 이므로 a라는 공간

System.out.println(a); ///a라는 공간에 저장된 데이터(10)를 출력

a = a +4; // 10 이라는 값에 4를 더한 결과를 a라는 공간에 다시 저장

 

6.변수의 종류

1)Local Variable(지역변수):자신을 만든 영역에서만 사용이 가능한 변수

=>메소드(함수) 안에서 만들어진 변수

 

2)instance Variable(멤버변수):자신을 소유하고 있는 객체를 통해서만 접근이 가능한 변수

=>클래스 안에서 static키워드 없이 메소드 바깥에 선언된 변수

python에서는 init안에 만들어진 self

 

3)static Variable(클래스 변수):자신을 소유하고 있는 클래스를 통해서 접근이 가능한 변수

=>클래스 안에서 static이라는 키워드와 함께 메소드 바깥에 선언된 변수

=>자바에선느 이 변수를 이용해서 전역변수(Global Variable-아무 곳에서나 사용가능한 변수)를 만듭니다.

local global를 통해서 나누기도 해다.

 

7.기본형

=>변수가 데이터 자체인 자료형

=>boolean:byte, short, char, int,long: float, double

1)boolean

=>참과 거짓을 저장할 수 있는 자료형

=>boolean literal:true false

=>boolean자료형은 boolean만 저장 가능

=>변수를 만들 때 앞에 is를 붙여서 boolean이라는 것을 나타내는 경우가 많습니다.

=>is로 시작하는 모든 것들은 참 과 거짓을 판별하는 것입니다.

python에서는 연산은 가능 하는데 의미가 없다.

데이터 있으면 true등으로 하기 때문에 가능하다.

true하고 true 2가 나온다.

하지만 java는 연산이 안된다.

 

=>실습 : boolean 변수를 만들고 데이터를 저장한 후 값을 출력해보기

//boolean 변수를 만들어서 값을 저장

boolean isNum = true;

//변수의 값을 출력

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

 

2)정수

=>byte(1byte), short(2byte), char(2byte), int(4byte),long(8byte)

=>bit(binary digit):0또는 1둘 중에 하나의 데이터를 저장할 수 있는 메모리 크기

=>byte:8비트로 2 8승 까지를 구별할 수 있는 크기 - 256가지 구분 영문 1글자

=>1 byte -128 ~ +127까지 저장 ,데이터를 메모리에 저장되는 구조로 저장하기 위해서 사용, 파일의 내용을 저장하거나 네트워크에서 데이터를 주고 받을 때 주로 이용 -27  ~ 27-1

2 8 => 256 나누기

=>short : -32768 ~ 32768 까지 사용 -215  ~ 215-1 ,예전에 좌표 같은 것을 short를 이용해서 저장

=>char : 0 ~ 65535 까지 저장 ,정수를 저장하고 있다가 출력을 할 때는 정수에 해당하는 ASCII코드에 해당하는 문자를 출력

48 ->'0'

65 ->'A'

97 ->'a'

0 ->null

7 ->beep(메모리 없을 때 9번 삑 소리난다.)

 

=>int  : 4byte, -21 ~+21억 까지 표현 ,정수의 기준형, 10이라고 입력을 하면 int 10입니다.

가장많이 사용되는 정수 자료형 -2^31  ~ 2^31  -1

 

=>long :8byte , 크거나 작은 정수 표현, 리터럴로 표현할 때는 뒤에 L또는 소문자 l 을 붙임

10L이라고 하면 long형 정수 10입니다. -2 ^ 63  ~ 2^63 -1

 

=>변수를 만들면 자신이 저장할 수 있는 크기보다 크거나 작은 값은 저장할 수 없습니다.

다른 변수의 데이터를 저장할 때는 자신의 크기와 같거나 작은 자료형의 변수의값만 저장가능

 

int long을 저장 못함

long int는 저장 가능

 

=>크기

byte< short< char< int <long

bytes는 네트워크 나 파일 내용 읽을 때 중요하다.

42억은 float double를 자주 사용합니다.

word는 한번에 데이터 주고 가고 받는 것이다.

word 32bit

하나의 워드 크기로 하면 괜찮은데 여러개 할 때 long이 문제 있다.앞부분은 괜찮은데 뒤부분 계산할 때 문제가 있다.

C언어의 크기는 word이다. int 원래는 2byte였는데 지금은 32bit이다.

 

=>실습

//자신의 나이를 저장하기 출력

//20이라는 값을 정수 변수 age에 저장

int age = 20;

//age에 저장된 값을 콘솔에 출력

System.out.println("나이는 : "+age);

 

분석의 마지막은 보고서이다.

browse에서 만드는 것 좋다.

application의 마지막은 배포이다. 분석의 마지막은 보고서를 만드는 것이다.

 

=>java에서 하나의 문자 저장

문자 리터럴 표현 : '문자' 또는0x16진수 2개 등으로 표현

자료형은 char에 저장하면 출력할 때 문자로 출력되고 다른 정수 자료형에 저장하면 숫자로 출력

 

char ch = 'A';

int c = 'A';

System.out.println("ch:"+ch); //char를 출력하므로 A로 출력

System.out.println("c:"+c);   //int를 출력하므로 65로 출력

                      

char ch1 = 65;

System.out.println("ch:"+ch1); //65 A로 출력

 

 

3)실수

=>float(4byte) : +-2 38승 정도의 데이터 까지 표현, 숫자의 정밀도는 소수 7자리 정도

literal로 표현할 때는 뒤에 소문자 f를 추가

4.07f 형태로 표현

 

=>double(8byte) : +-2 308승 정도의 데이터 까지 표현, 숫자의 정밀도는 소수 15자리 정도

실수의 기준형은 double이어서 특별한 문자 없이 표현

3.14 로 입력하면 실제 저장은 +0.314E+002의 지수 형태로 저장

0.314 * 10 2

지수 형태로 저장해야 작은 크기로 넓은 범위의 숫자를 표현할 수 있기 때문입니다.

float 을 사용하는 것이 메모리를 절약하는 것이기는 하지만 되도록이면 double을 사용하는 것을 권장하는데 그 이유는 지금의 cpu는 산술 연산을 빠르게 하기 위해서 수치보조 프로세서를 가지고 있는데 이 수치보조 프로세서의 연산 단위가 double입니다.

 

=>실수를 가지고 연산할 때는 주의해야 합니다.

실수는 정확하게 표현할 수 없는 경우가 있기 때문입니다.

 

int i = 1;

int sum = 0;

for(int j = 0; j < 1000; j = j+1) {

sum = sum +i;

}

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

 

 

double i = 0.1;

double sum = 0.0;

for(int j = 0; j < 1000; j = j+1) {

sum = sum +i;

}

System.out.println("sum:" + sum);//0.1 1000번 더했는데 100.0이 아님

                      

System.out.println("1-0.8:" +(1-0.8)); //1-0.8 0.2를 비교했는데 다르다고 나옴

System.out.println("1.0-0.8:" +(1.0-0.8));

 

컴퓨터 가지고 실수 연산하면 잘 못 나올 수 있다.

int a = 23;  =>10진수

컴퓨터는 10진수 아니고 2진수로 저장

8진수, 16진수는 2진수를 줄여쓰기 위해서 사용한 것이다.

8진수는 2진수 3개씩 묶은 것이고

16진수는 2진수 4개씩 묶은 것이다.

23 2진수로 변환

몫이 0이 될때 까지 나눈다.

8진수 등을 설명한다.

10111(2)

 

음수는 양수의 2의 보수

=>2의 보수는 1의 보수 + 1

=>1의 보수는 0-> 1 1->0

a = -23 =>23 2의 보수이다.

-23시 먼저 23을 찾는다.

1111 1111 1111 1111 1111 1111 1110 1000

+                                        1

1111 1111 1111 1111 1111 1111 1110 1001 =>-23

0000 0000 0000 0000 0000 0000 0001 0111=>

뒤쪽에서 가장 먼저 만나는 1을 찾아서 그 자리를 1로 두고 앞에는 다 뒤집는다.

첫 번째 자리는 1이면 음수이다.

 

-1:

0000 0000 0000 0000 0000 0000 0000 0001

1111 1111 1111 1111 1111 1111 1111 1110 ->1 의 보수

+1      1111 1111 1111 1111 1111 1111 1111 1111 -1

-1->가장 큰 숫자  infinite

12의 보수 구하는 것이다.

indexOf -1로 준다 내가 끝까지 가봤는데 없더라

음수 필요 하는지 확인해서 음수가 필요하면 -1이지만 음수가 필요 없으면 가장 큰 숫자이다.

비디오 재생회수 -> 최대수 숫자여서 -1이 잴 크다.

 

소수의 정밀도 문제

10진수를 2진수로 표현

=>소수부분에 2를 곱해서 정수 부분만 순서대로 표기

0.5 * 2 = 1.0 ->0.1(2)

0.625 (10)  -> 0.625 * 2 = (1.25-1) *2 => 0.5 * 2 =>1.0 ->0.101           2진수

 

0.2 * 2 = 0.4 * 0.2 = 0.8 * 2  = (1.6 -1)*2 =  1.2

0.0011

 

컴퓨터에는 0.2가 존재하지 않는다.

숫자표현의 한계 때문에 틀리다.

실수가지고 할 때는 정수로 하는 것이 좋다. 아니면 문자별로 해서 자리별로 계산하는 것이 좋다.

 

0.1 * 10 -> 1.0 * 100 = 100/ 10  -> 10

 

1- 0.8 == 0.2 =>구조적인 문제

10- 8 == 2

실수를 정수로 바꾸거나 다른 모듈로 이용해서 하는 게 좋다.tensorflow  keras등은 이런  수식을 해준다.

python은 마지막 것이  -1인데 재일 마지막이라는 의미를 한다.

 

 그림은 색갈의 집합

ARGB

RGBA

A-투명도

이미지 분석 패턴을 분석 4byte 씩 한다. 4개씩 모아서 선을 그은다. 색상이 4개로

 

컴퓨터는 2진수로 저장한다. 10진수로 저장하지 못한다. 실수를 저장하는데 한계가 있다.

고정소수점 3.14 ->0.314E+002

 

0000 0000 00

9999 9999 99

8개는 숫자 쓰고 뒤에 두개는 지수를 사용한다.

지수표기법을 이용하면 넓은 범위를 표시할 수 있다 계산 속도나 늦어지지만

0.314E002 + 0.67E001 ->cpu옆에 수치보조 시스템이 한다. double

double 키 저장하고

python에서 숫자의 기본은 실수 이다. 소수와 같이 나오는 것이 종종 있다.

자신의 키와 몸무게를 저장할 수 있는 변수를 만들어서 저장한 후 출력

자바에서 정수 , 실수

자료형 변수이름 = ;

8.Type Casting

=>데어터의 자료형을 변환하는 것

 

1)분류

=>자동 형 변환: 데이터의 자료형이 자동으로 변환되는 경우

=>강제 형 변환: 원하는 결과를 만들기 위해서 강제로 자료형을 변환하는 경우

 

2)형 변환이 가능한 경우

=>숫자 데이터끼리는 형 변환이 가능합니다.

(byte, short, char, int ,long,float, double)

=>참조형 데이터의 경우는 상속 관계인 경우만 가능합니다.

 

3)자동 형 변환

=>표현 할 수 있는 범위가 큰 자료형의 변수에 작은 자료형의 데이터를 대입하는 경우

long 8byte이고 float 4byte이지만 long은 정수이고 float는 실수로서 float이 표현범위가 long보다 크기때문에 float long보다 큽니다.

ex)

float f =10;

f float변수인데 10이라는 int형 데이터를 대입했습니다.

float f = 10.0f;로 변경되서 처리

 

=>정수 자료형의 변수에 int정수 상수를 대입하면 변수가 표현할 수  있는 범위 내의 숫자라면

그 변수의 자료형으로 변경되서 대입됩니다.

리터럴은 변경이되서 저장되지만 변수의 값은 변경이 안되기 때문에 저장이 안됩니다.

 

ex)

short s = 3000;//3000이라는 int형 리터럴이 short 범위 안에 있는 정수이므로 short로 변경되서 저장이 됩니다.

int n = 3000;

s = n ;//n int형 변수이므로 이 데이터의 크기를 줄여서 short에 대입할 수 없습니다.

 

=>산술연산을 하면 2개이 자료형이 동일할 때는 동일한 자료형으로 결과를 리턴하고 2개의 자료형이 다를 때는 큰 자료형으로 변환해서 연산을 수행

그리고 int보다 작은 자료형으로 산술연산을 하면  int로 변경해서 산술연산을 수행

정수 / 정수 = 정수;

10 / 4 = 2.5가 아니라 2=>소수는 버림

 

short s1 = 100;

short s2 = 200;

short s3 = s1+s2;//에러가 발생합니다.

short +short 이지만 자바는 int로 변경해서 연산을 하기 때문에 int+ int가 되서 short에 결과를 저장할 수 없습니다.

 

실습) 자동형변환

컴퓨터도 단위가 있다.

컴퓨터는 int보다 작은 단위로 계산 못한다.

                       //자동 형 변환

                       double d = 10;//10 10.0으로 변환해서 저장

                       System.out.printf("d:%f\n",d);

                      

                       //숫자의 표현범위가 int보다  작은 변수에 저장 가능한 정수 리터럴(상수)를 대입하면 형 변환해서 대입합니다.

                       //표현범위가 더 큰 정수는 대입이 안되고 더 큰 자료형 변수에 있는 데이터도 대입이 안됩니다.

                       short s = 3000;//3000이라는 상수는 short표현 ㅂㅁ위 내라서 대입이 가능

                       //아래 문장은 에러

                       //s = 65535;//65535 short표현범위 밖이라서 대입이 불가능

                      

                       int n = 3000;

                       //s = n ; //같은 3000이지만 변수에 저장된 3000int 3000이라서 더 큰 데이터라서 역시 에러가 발생합니다.

                      

                       /*자바는 산술연산(+,-,*,/,%)을 할 때 2개의 자료형이 다르면 더 큰 자료형으로 변환해서

                        *연산을 하고 int 보다 작으면 int로 변환해서 연산

                        *2개의 자료형이 같으면 결과도 동일한 자료형으로 리턴

                        */

                      

                       double result = 10 /3;

                       //결과는 3.3이 아니고 3.0

                       //정수 /정수는 결과가 정수

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

                      

                       //int보다 작은 자료형의 연산은 int로 변환해서 처리하기 때문ㄴ에

                       //산술연산의 결과 최소 자료형은 int

                       short s1 = 300;

                       short s2 = 100;

                       //short s3 = s1+ s2;//이 구문은 에러

                       //short+short 이지만 결과는 int

                       //산술 연산의 최소단위는 int

                       //cpu의 정순 최소 처리 단위가 int

 

 

4)강제 형 변환

=>데이터의 자료형을 강제로 변경하는 것

=>숫자 데이터끼리 변환이 가능하고 참조형인 경우는 상속 관계인 경우만 가능

=>숫자 데이터의 형변환을 하는 경우는 원하는 결과를 만들기 위해서 또는 큰 자료형의 데이터를 작은 자료형의 데이터로 변환하기 위해서 입니다.

=>방법

(변환할 자료형) 데이터

 

=>데이터라고 할 때는 변수와 상수 모두 그리고 변수만 가능할 때는 변수라고 기재

=>실수를 정수로 변환하면 소수는 버려지게 됩니다.

 

ex) 정수 / 정수를 할 때 소수 까지 결과를 저장하고 싶은 경우

double result = 10 /7 ;

//이렇게 하면 결과는 1.0

 

double result = (double)  10 /7 ;

//10 double로 변환해서 10.0/7을 만들게 되고

//실수와 정수가 연산을 정수를 실수로 변환해서 10.0/7.0이 되고 그리면 결과는 1.4...

 

//실수 /실수를 했을 때 몫만 취하고 자 하는 경우

 

int r = 10.3/5.2;//에러 실수 /실수 이므로 결과는 실수인데 int에 저장할려고 해서 에러

 

int r = (int)(10.3/5.2) ;결과를 정수로 강제로 형 변환을 해서 1로 만들어서 r에 대입합니다.

double r = 10 /4;

                       System.out.println("r:"+r);//정수 /정수는 정수 2.0

                      

                       r = (double)10/4;

                       //10을 실수로 변경했기 떄문에 실수/정수는 실수로 결과를 리턴

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

                      

                       //실수 /실수 한 결과를 정수로 저장하고자 하는 경우에는 결과를 int로 변환

                       int result = (int)(10.3 / 5.2);

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

                      

                       double d = 18.75;

                       //d를 소수 첫째자리에서 반올림해서 정수로 변환

                       //int n = (int)Math.round(d);

                       int n = (int)(d+0.5);

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

                      

                       //일의 자리에서 반올림

                       n = (int)(d* 0.1 + 0.5) * 10;

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

반응형

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

java-6  (0) 2020.09.26
java-5  (0) 2020.09.24
java-4  (0) 2020.09.22
java-3  (0) 2020.09.20
java-2  (0) 2020.09.20

+ Recent posts