728x90
반응형
728x90
금은모래 캠핑장

 

친구들과 이야기만 했던 캠핑을 처음으로 가본 날 😄
캠핑 스팟을 찾아 다양한 곳을 가본 친구들이 근교의 캠핑장 중에서도 여주에 금은모래 캠핑장을 추천해줘서 다녀왔다 

 

 

 

 

 

 

728x90
반응형
728x90

그동안 int, float, char , boolean 등 기본자료형 또는 사용자 정의 자료형이지만 자주 쓰이는 String 등을
중심으로 기본적인 구조를 공부했지만 이제 사용자 정의 자료형에 대해서 좀 더 학습해보겠습니다.

 

💡 클래스 = 모델을 설계하는 도구

 

 

 

 

 

사용자 정의 자료형의 이해

각각의 데이터에 알맞은 타입을 작성해줌으로써 변수를 선언할 수 있음을 명심해야합니다. 선언이 되지 않으면,
메모리에 만들어 질 수 없기 때문에 자료형이 중요합니다.
사용자 정의 자료형은 class 라는 도구로 설계가 가능(모델링하는 도구)합니다.
객체 (Object) : 기억공간 1개로 표현할 수 없고 , 기억공간 여러개를 모아놓은 구조체를 말합니다.
기억공간을 여러개로 표현할 수 있는 것이 객체입니다. 배열과는 다르게 기억공간 안에 담기는 데이터들의 타입이 다른 이질적인 구조입니다.

DTO(Data Transfer Object) : 데이터 전송을 위해 생성되는 객체 로직을 가지지 않는 순수한 데이터 객체
(getter & setter 만 가진 클래스)

 

Q. 책이라는 데이터를 변수에 저장하기 위해서는 책이라는 자료형이 필요합니다.
제목 | 가격 | 출판사 | 저자 | 페이지수 | ISBN       →     BookDTO = 책;    자료형 변수 : BookDTO b;

객체지향 측면 : 현실세계에 있는 객체를 객체지향프로그램에서 사용하기 위해 객체는 상태정보(멤버변수)와 행위정보(멤버메서드)를 가지고 있습니다.

        public class Ex_11_BookDTO {
            public class BookDTO {
                public String title;
                public int price;
                public String company;
                public String author;
                public String isbn;
                public int page;
            }
        }

        -> 현재 상태정보만 작성이 되어있는 상태 + 행위정보도 같이 가지고 있는 구조로 만들어질 수 있다.

        public void read() {
            System.out.println("책을 읽는다")
        }

 

 

만들어진 클래스를 사용하려면 객체를 생성해야합니다.

객체를 메모리에 로딩하는 것 = 객체를 생성하는 과정을 살펴보겠습니다.

객체 자료형은 4byte의 크기를 가지고 있고, 객체 변수에는 번지수가 저장됨을 다시 한번 말합니다. new 연산자와 생성자 메서드로 객체를 생성하면 데이터가 실체화가 됩니다. 인스턴스변수 p가 구체적인 대상물 인스턴스(객체)를 가리키고 있기 때문에 , 해당 변수가 인스턴스 변수가 됩니다.

 

생성자 메서드 (Constructor)란?

객체를 메모리에 멤버변수 & 멤버메서드를 생성하는 역할 = 생성자 메서드 (행위) 메서드는 어딘가에 정의가 되어있고, 메서드를 사용하려면 호출하여 불러와야 합니다.
new Person() ; → Person 클래스 내부에 있는 public Person이라는 메서드를 찾아가야 합니다.
일반적으로 어떤 클래스를 생성하면 클래스 내부에는 자기 자신을 메모리 객체로 생성해야하는데 이걸 기본생성자 (default constructor) 라고 하고, 모든 클래스는 기본 생성자를 가지고 있습니다.
생성자 메서드의 특징으로는 클래스 이름과 메서드 이름이 동일합니다 그리고 return 타입이 아예 없기 때문에 void를 사용하지 않습니다.

생성자의 역할은 기본적으로 멤버 변수와 메서드를 메모리에다가 기억공간을 만들어주는데, 해당 기능을 하는 코드가 기계적으로 내부에서 자동으로 처리를 해주는 역할을 합니다.

 

this : 자신을 가리키는 객체 변수 , 참조변수 , 포인터 변수라고 불립니다.

객체가 만들어진 다음에 객체가 자기 자신의 번지를 가리키는 객체가 만들어집니다. 컴파일러가 멤버변수 및 메서드의 메모리를 생성하고 해당 번지를 this라는 객체변수에다가 넣어줍니다.
눈에 보이지 않지만 자기 자신을 가리키는 객체의 역할을 하며 객체 내부에서 자기 자신의 멤버변수를 가리킬 때 this를 사용하여 가리킬 수 있습니다.

💡 객체가 생성된 후 멤버에 접근하는 방법 . (dot, 도트, 점) 참조연산자로 접근이 가능해집니다.

Person p = new Person(); p라는 인스턴스 변수를 이용하여 데이터에 접근 < p.> p가 가리키고 있는 곳에 name or age 등에 접근이 가능해집니다. ex) p.name / p.phone / p.play();

하나의 클래스 (Person)을 만들어두고, 언제든지 객체를 생성해서 사용할 수 있기 때문에 재 사용성을 가지고 있습니다.

 

힙(Heap Memory)에 만들어진 객체 , 객체의 실체 = 인스턴스 (instance)

 

728x90
반응형
728x90
메서드의 오버로딩
하나의 클래스 내에서 동일한 이름의 메서드를 여러개 사용할 수 있는 객체지향 기법

 

 

 

메서드의 동작 및 기능이 비슷하다면  메서드 이름을 같게 만들어 사용하면 편리하다.
메서드도 변수와 마찬가지로 같은 클래스 내에서 서로 구별될 수 있어야 하기 때문에 각기 다른 이름을 가져야한다.
그러나 자바에서는 한 클래스 내에 이미 사용하려는 이름과 같은 이름을 가진 메서드가 있더라도
조건 - 메서드의 이름이 같고, 매개변수의 개수 or 타입이 다르면, 같은 이름을 사용해서 메서드를 정의할 수 있다.
(=메서드의 시그니처가 달라야한다.)

오버로딩된 메서드들은 매개변수에 의해서만 구별될 수 있으므로 반환 타입은 오버로딩을 구현하는데 아무런 영향을 주지 못한다.

 

public class Ex_9_Overloading {
    public static void main(String[] args) {
        float v = add(35.6f, 56.7f);
        System.out.println("v = " + v);
        
        int x = add(15,5);
        System.out.println("x = " + x);
    }

    //Q.매개변수로 두개의 정수 값을 받아서 / 총합을 구하여 / 리턴 하는 / [메서드를 정의]하세요.
    public static int add(int a, int b) {  
		//main이 static 키워드를 가지고 있으니 호출될 메서드에도 static을 작성
        int sum = a+b;
        return sum;
    }

    //Q. 매개변수로 두개의 실수 값을 받아서 / 총합을 구하여 / 리턴하는 / [메서드를 정의] 하세요.
    public static float add(float a, float b) {
        float sum = a+b;
        return sum;
    }
}

 

 

생성된 메서드들의 이름은 같지만 메서드 내의 개수는 같고, 매개변수가 int와 float로 다르기때문에 add 2개를 중복하여 정의할 수 있다 
→ 메서드의 오버로딩메서드들의 이름이 같은 상황에서 만약 add의 중복정의가 많이 되어있다면, add 메서드는 어떤 메서드로 호출이 되어야 하는지는아래로 전부 읽어내려가면서 찾기 때문에 실행 속도가 더딜 수 있다.
매개변수의 타입을 하나하나 비교해서 일치하는 메서드를찾아야하기 때문이다.

동작이나 기능이 비슷하더라도 오버로딩기법으로 작성하는 것이 아닌 , 타입에 맞춰 각각의 메서드 이름을 지정하게 되면,
개발자가 알아야하는 메서드 이름들이 너무 많아지기 때문에 효율적으로 작성하기 위해 중복정의가 가능하도록 한다.

 

정적바인딩이란?
컴파일 시점에서 사용될 (호출될) 메서드가 결정(연결) 되는 바인딩

정적 바인딩(Static binding)은 프로그램의 실행 전에 코드가 수행되는 바인딩 방식입니다.

정적 바인딩은 일반적으로 메서드 오버로딩(Overloading)과 관련이 있습니다.
메서드 오버로딩은 같은 이름의 메서드가 매개변수의 개수나 타입에 따라 다른 동작을 수행할 수 있는 기능을 말합니다.
정적 바인딩은 컴파일러가 함수 호출 시 해당하는 함수를 컴파일 타임에 정확하게 판단하고 바인딩합니다.
이는 메서드 호출 시 호출한 코드의 컨텍스트와 매개변수의 개수와 타입을 기반으로 결정됩니다.

ex) add(34.5f, 56.5f) → add_float_float(34.5f, 56.5f) → 정적바인딩으로 인해 왼쪽과 같이 코드를 작성하면
컴파일될 시점에서 매개변수의 타입을 알아내 _float_float 이렇게 바꾼 후 해당 메서드를 호출하기 때문에 시간이 소요되지 않습니다.

정적 바인딩의 장점은 실행 시간에 바인딩이 발생하지 않기 때문에 실행 성능이 빠르다는 것입니다.
또한 컴파일 시에 바인딩이 결정되므로 오류를 미리 확인할 수 있습니다.
하지만 정적 바인딩은 실행 중에 동적으로 객체의 타입이 변하는 상황에서는 적용되지 않습니다.
예를 들어, 다형성(polymorphism)이 적용된 경우에는 정적 바인딩이 아닌 동적 바인딩(Dynamic binding)이 사용됩니다.
동적 바인딩은 실행 시간에 객체의 실제 타입에 따라 메소드를 결정하므로 실행 시 동적으로 바인딩이 발생합니다.

요약하면, 정적 바인딩은 컴파일 타임에 함수 호출을 어떤 구현체와 연결할지 결정하는 바인딩 방식입니다.
함수 오버로딩과 관련이 있으며 실행 성능이 빠르고 컴파일 시에 오류를 확인할 수 있습니다.
하지만 실행 중에 객체의 타입이 변하는 경우에는 적용되지 않습니다.

728x90
반응형
728x90
Method : 동작
메서드를 정의하고 메서드를 사용(호출)하는 방법

 

Method(메서드)란?

메서드는 동작을 수행할 때 꼭 필요한 기능을 할 수 있도록 해준다. 메서드가 없이는 기능의 동작이 안된다.
개발자가 프로그래밍을 해 놓은 상태로 동작을 할 때, 그 동작을 할 수 있도록 해주는 방법이라고 이해하는게 쉽다.
반복적인 동일 작업을 메서드를 만들어 사용하면 편리하게 사용이 가능하다.
객체 지향 언어에서의 행위나 동작을 의미한다고 말하며, 메서드를 통해서 데이터를 서로 주고받으며 상호작용을 한다.
→ 코딩의 목적 메서드도 클래스처럼 API에서 제공해주는 메서드 , 사용자 정의 메서드 두 종류로 분류가 가능하다.
    다른 언어들에서는 함수(function)이라고 부르기도 한다.

 

https://cloudstudying.kr/lectures/81

 

Object : 사람 동작 1 → 먹다 동작 2 → 걷다 / 해당 동작들은 독립적으로 만들어진다
class : person 동작 1 → eat() 동작 2 → walk() / 객체 지향 프로그램안에서는 클래스 안에 이런 기능을 하는 동작들을 넣어서 만든다.

프로그래밍 언어에서의 메서드

 

 


메서드는 변수라고도 볼 수 있다. (어떠한 동작이 수행된 후 처리의 결과 값이 담겨진 변수)

 

 

메서드는 우선 접근제한자를 먼저 설정해주는데 보통 public으로 설정하여 사용한다.
리턴타입은 수행된 후에 반환하는 결과의 자료형이며, 아무 결과도 반환하지 않으면 자료형에 void를 입력해준다. → void는 반환할 값이 없다는 걸 의미한다.

메소드명 뒤의 ()안에는 매개변수를 작성하며 콤마로 여러개의 매개변수 작성이 가능하다.만약 매개변수가 없더라도 ()는 꼭 작성해주어야 한다.
매개변수 작성시에는 변수의 타입이 같아도 변수의 타입을 생략할 수 없고, 선언할 수 있는 매개변수의 개수는 제한은 없지만 많은 경우 배열이나 참조변수를 사용하며 된다.

 

public class Ex_6_makeMethod {
    public static void main(String[] args) {
        int a = 3;
        int b = 5;
        //add라는 메서드를 호출하여 두 수의 합의 결과를 받아보자
        int result = add(a,b);
        System.out.println("result = " + result);

    }
    //메서드는 독립적으로 만들어야 한다 / main 메서드 밖에서 작성한 후 main메서드에서 호출하여 사용하는 방식이다.
    //Q.[매개변수로 2개의 정수를 받아서] [총합을 구하여][리턴]하는 [메서드를 정의]해보자

    public static int add(int x, int y) {
        int sum = x+y;
        return sum;
    }
}

 

우선 add 라는 메서드를 만들어서 main 메서드에서 호출하여 결과 값을 출력해보는 코드를 작성해보았다.
메서드의 선언부에서 메서드의 이름(add), 매개변수 선언(int x, int y), 반환 타입(static int)을 정해주었고 두 개의 정수를 입력받아 두 값을 더한 결과를 반환하도록 했다.
메서드의 선언부는 메서드가 호출되는 모든 곳에서 동일하게 쓰이기 때문에 신중하게 작성해야한다. 수정 시 모든 곳을 변경해야 하는 번거로움이 발생할 수 있다.

반환 타입이 정해져있지 않을 때는 void로 작성해두어도 되지만 이후 return 반환값의 타입이 정해진다면 반환 타입을 정해줘야한다.
메서드는 수행한 결과를 반환값을 호출한 메서드로 전달하는데, (여기서는 main) 이 값의 타입은 반환 타입과 일치하거나, 적어도 자동 형변환이 가능한 것이어야한다.
그래서 위의 코드에서도 add메서드 내의 return값인 sum이 int형이므로 main 메서드 에서 호출된 값을 담을 result의 타입도 int형으로 작성되었다. return문은 단 하나의 값만 반환할 수 있다.

 

메서드 앞에 static이 붙어 있으면 클래스 메서드이고 , 붙어 있지 않으면 인스턴스 메서드이다.
클래스 메서드는 클래스 변수처럼 객체를 생성하지 않고도 <클래스이름.메서드이름>과 같은 식으로 호출이 가능하지만( “ . “ 을 이용해서 호출가능), 인스턴스 메서드는 반드시 객체를 생성해야만 호출할 수 있다.
객체를 생성한다는 의미는 new 연산자를 사용하여 인스턴스(객체)를 생성함을 의미한다.

 

static은 언제 붙여서 작성해야 할까?
  1. 클래스를 설계할 때 멤버변수 중 모든 인스턴스에 공통으로 사용하는 것에 static을 붙인다.
  2. 클래스 변수(static)는 인스턴스를 생성하지 않아도 사용할 수 있다.
  3. 클래스 메서드(static메서드)는 인스턴스 변수를 사용할 수 없다.
  4. 메서드 내에서 인스턴스 변수를 사용하지 않는다면, static을 붙이는 것을 고려한다.

 

매개변수 전달 기법 (Call By Value & Call By Reference)

 

외부로부터 데이터를 받을 때, 값을 그대로 받을 수도 있지만 (Call By Value - 값 전달) 값을 번지(주소)를 갖고 있는 데이터를 받을 수도 있다. (Call By Reference(번지 전달))
java는 객체 지향 프로그래밍은 객체를 대부분 다루기 때문에 Call By Reference가 자주 사용된다. 이 때, 번지의 데이터가 어떤 데이터인지 확인할 필요가 있다.

Call By Value Call By Reference
값에 의한 호출방식은 인자로 받은 값을 복사하여 처리한다. 참조에 의한 호출방식은 인자로 받은 값의 주소를 찹조하여 직접 값에 영향을 준다.
원래의 값이 수정되지 않는다. 원래의 값이 수정된다.
변수의 복사본이 전달된다. 변수 자체 전달된다.
실제 인수가 다른 메모리 위치에 생성된다. 실제 인수가 같은 메모리 위치에 생성된다.

 

  • 기본 자료형 : call by value 로 동작 (int, short, long, float, double, char, boolean)
  • 참조 자료형 : call by reference 로 동작 (Array, Class Instance)
728x90
반응형
728x90
반복문(loop) for , foreach

 

  • 일반적으로 반복하는 횟수가 정해진 경우에 (예측 가능) 사용하고 문법은 초기식, 조건식, 증감식으로 구성되어 있고 세미콜론으로 구문지어진다.
  • 초기식은 맨 처음 한번만 수행되며 이후, 조건식 → 반복문장 → 증감식이 반복적으로 수행된다.

 

for loop의 실행과정

 

http://www.tcpschool.com/php/php_control_loop

 

foreach문의 실행과정 (향상된 for문)

 

http://www.tcpschool.com/php/php_control_loop

 

numArray에서 데이터를 하나씩 전부 꺼내오면서 출력해준다.

//Q. 배열에 있는 원소를 출력해보자
        int [] numbers = {1,2,3,4,5,6,7,8,9,10};

        for (int i=0; i< numbers.length; i++) {
            System.out.println(numbers[i]);
        }

//출력물 -> 1,2,3,4,5,6,7,8,9,10

for(int num : numbers) {
            System.out.println(num);
        }

//출력물 -> 1,2,3,4,5,6,7,8,9,10

 

배열로 만들어진 데이터들은 각각의 기억공간에 저장되어 있으며, 인덱스 번호가 0부터 주어지게 된다.
배열이름[인덱스번호] -> 위의 문법으로 기억공간의 데이터에 접근할 수 있게된다.
해당배열의 길이만큼 반복되어야 해당 데이터가 순서대로 출력될 수 있어 길이는 배열이름.length로 설정할 수 있다.

  • for(int num : numbers) { System.out.println(num);}
    → foreach문법으로 for문안의 괄호에 배열내에 있는 데이터들을 담을 수 있는 변수를 설정한 후 해당 변수를 출력하면 배열 내의 데이터들이 전부 출력된다.

 

While(반복문) - 먼저 조건식 검사를 반복할 문장을 실행한다.

몇번이 반복될 지 예측이 어려울 때 보통 while문을 사용한다.

 

while문은 먼저 조건식을 확인하게 되는데 , 처음부터 조건식이 거짓인 상황이면 내부 코드를 하나도 실행하지 않 바로 수식을 빠져나가는 상황이 발생할 수 도 있다.

 

제어문 break, countinue
반복문의 실행 상태를 제어하고자 break문과 continue 문을 사용한다.

 

  • break문 - 현재 사용중인 반복문을 중단하고 제어를 반복문 바깥으로 이동한다. / 반복문이 동작 중 break를 만나게 되면 break가 속해있는 반복문을 바로 빠져나가게 된다.
  • continume문 - 현재 수행중인 반복문에서 현재 조건 값에 대한 처리를 중단하고 다음 조건 값에 대한 처리를 실행 / 반복문 실행 중 continue를 만나면 continue 아래의 문장을 실행하는 것이 아니라 반복문의 시작으로 돌아가도록 한다.

 

public class Ex_5_breAk_conTinue {
    public static void main(String[] args) {
        char[] c = {'s','h','u','t','d','o','w','n'};

        for(int i=0; i<c.length; i++) {
            if(c[i] == 'o')
                break;
            System.out.println(c[i]);
        }
        int count = 0;
        for (int i=1; i<=10; i++) {
            if(i%3 !=0 ) continue;
                count++;
        }
        System.out.println("count = " + count);
    }
}

//s,h,u,t,d 까지의 문자가 출력된다.
728x90
반응형
728x90

 

 

조건문 → IF문

 

 

순서도로 한번 알아보자 (=flowchart)

 

순서도에서 마름모 모양은 판단조건이며 true or false에 따라 동작하는 구문이 달라진다.
조건식으로 올 수 있는것은 참 or 거짓으로 밖에 오지 못하기 때문에 관계연산자와 논리연산자를 사용하여 조건식을 작성 할 수 있다.
{ }를 이용하여 시작과 끝을 설정할 수 있고, 참일 때 블록안의 문장들이 실행되고, 실행이 완료되면 if 문을 빠져나가게 된다.
만약 조건식이 참일 때, 하나의 문장만 실행되는 경우에는 { } 를 작성하지 않아도 된다.

 

 

if문을 사용하여 프로그래밍 시 다양한 환경에 대해 조건에 따라 다른 동작을 할 수있게 만든다.

  1. 단순 if 문 → 조건식이 참이면 중괄호로 둘러 쌓인 블록안의 문장들이 실행된다.
  2. 블럭 if 문 → if의 조건식이 참이면 조건식 바로 다음의 블록이 실행되고, 조건시기 거짓이면 else 문 다음 블록이 실행된다.
  3. 다중 if 문 → if 문 안의 문장이 또 다른 if 문인 경우 (if-else문 포함)

 

Switch - case 문
 주로 다중 선택에 사용되며, 다중 if문 보다 간결하지만 사용영역이 if-else에 비해 제한적이다.

 

switch문의 문법은 switch문은 하나 이상의 case문으로 구성되고, 대개 default문도 있지만 이는 필수적인 요소는 아니다.

switch-case의 순서도를 살펴보자 표현식에서 시작되어 각각의 case를 읽어가며 코드 블럭을 실행하고, 해당 case들과 일치하는 문장이 없다면 가장 하단의 default 문장을 실행하며 switch문이 종료된다.

 

 

switch() 괄호 안에 조건식을 입력하여 (수식) { } 시작과 끝을 설정해준다. 해당 중괄호 안에는 case를 나열하여 조건별로 실행될 문장들을 작성하면 된다.
break; 는 case 하나 당 작성해두는 것이 좋다. break는 각각의 case의 값들과 일치하게되면 해당 case의 문장을 실행하고 해당 수식을 벗어나는 역할을 가지고 있다.
만약, break가 없다면 값과 일치하는 case문을 실행하고 해당 문장을 벗어나는 것이 아니라 다음 case들로 이동하여 실행되기 때문에 작성해주어야 제어가 가능하다.
default는 각각의 case문들이 조건식의 값과 일치하는 게 없을 때, default 문이 실행되며 해당 코들르 빠져나가게 된다.

case의 값은 다른데 만약 같은 코드를 실행하고 싶다면 case 값1 : case 값2 : 이와 같이 작성하면 된다.

 

 

 

import java.util.Scanner;

public class Ex_1_Switich {
    public static void main(String[] args) {

        System.out.println("요일을 입력하세요 = ");

        Scanner scan = new Scanner(System.in);
        String day = scan.next();


        switch(day) {
            case "월요일":
                System.out.println("농구하기");
                break;

            case "화요일" :
            case "수요일" :
                System.out.println("수영하기");
                break;

            case "금요일":
                case "토요일":
                System.out.println("휴식");
                break;
            case "일요일":
                System.out.println("야구하기");
                break;
            default:
                System.out.println("요일을 잘못 입력하셨습니다.");
        }
    }
}

-> 요일을 입력하세요 = 월요일
	 농구하기
728x90
반응형

+ Recent posts