인스턴스와 객체

객체

객체는 사람, 통장계좌, 자동차, 주문, 학생, 버튼 등 개별적으로 구분할 수 있는 실체를 의미한다.
객체는 자신의 고유의 이름과 상태와 행동을 갖는다.
객체의 상태를 표한혈 때 멤버변수라고 표현할 수 있으며, 객체의 행동을 메소드 혹은 멤버함수라고 표현한다.
클래스는 객체의 상태와 행동이 어떻게 만들지를 결정한 청사진이다.
즉, 클래스에서는 버튼이라는 객체가 클릭되어지면 다음화면으로 이동하는 행동을 정의하고 지금 버튼의 이름을 지정하는 상태 등이 동작할 수 있게끔 정의가 되어져 있는 설계도이다.

인스턴스

클래스가 메모리에 생성된 상태를 말한다. 클래스로부터 생성된 객체라고도 한다.
힙 메모리에 멤버 변수의 크기에 따라 메모리가 생성된다.
클래스를 기반으로 New 예약어를 통해 인스턴스를 생성한다.

객체와 인스턴스의 차이

객체는 소프트웨어 세계에 구현할 대상이고, 이를 구현하기 위한 청사진이 클래스 이며, 이청사진에 따라 생성된 실체가 인스턴스이다.

즉 개념적으로 인스턴스는 객체에 포함된다고 할 수 있고 인스턴스라고 표현을 하는 것이 더 정확하지만 둘을 같다고 봐도 틀린말은 아니다.

Comment and share

Static

staitc은 고정된이란 의미를 가지고 있다. static이라는 키워드를 사용하여 static변수와 static메소드를 만들 수 있는데 다른말로 정적필드와 정적 메소드라고도 하며 이 둘을 합쳐 정적 멤버라고 한다.(클래스 멤버라고도 한다.) 정적 필드와 정적 메소드는 객체에 소속된 멤버가 아니라 클래스에 고정된 멈버이다. 그렇기에 클래스 로더가 클래스를 로딩해서 메소드메모리 영역에 적재할 때 클래스 별로 관리된다. 따라서 클래스의 로딩이 끝나는 즉시 바로 사용할 수 있다.

정적 멤버 생성

static키워드를 통해 생성된 정적멤버들은 Heap영역이 아닌 Static영역에 할당된다. static영역에 할당된 메모리는 객체가 공유하여 하나의 멤버를 어디서든지 참조할 수 있는 장점을 가지지만 ㅁ의 관리 영역 밖에 존재하기에 static영역에 있는 멤버들은 프로그램의 종료시까지 메모리가 할당된 채로 존재하게 된다. 그렇기에 static을 너무 남발하게 되면 만들고자 하는 시스템 성능에 악영향을 줄 수 있다.

정적 멤버 선언

필드나 메소드를 생성 시 인스턴스로 생성할 것인지 정적으로 생성할 것인지에 대한 판단 기준은 공용으로 사용하느냐 아니냐로 내리면 된다. 그냥 생성한다면 자동으로 인스턴스로 생성되며 정적으로 생성하려면 메소드 선언시 static이라는 키워드를 추가적으로 붙이면 된다.

Comment and share

객체지향 프로그래밍

객체지향 프로그래밍(Object Oriented Programming)은 좀 더 나은 프로그램을 만들기 위한 프로그래밍 패러다임으로 조직을 상태와 행위로 이루어진 객체로 만드는 것이다.

문법과 설계

문법

하나는 객체지향을 편하게 할 수 있도록 언어가 제공하는 기능을 익히는 것이다. 이러한 기능들은 if,for문처럼 문법적인 구성을 가지고 있다. 이 문법을 이해라고 숙지해야 객체를 만들 수 있다. 객체를 만드는 법에 대한 학습이라고 할 수 있다.

설계

복잡한 현실을 추상화하는 것이 설계라고 할 수 있다.

부품화

메소드는 부품화의 예라고 할 수 있다. 메소드를 사용하는 기본 취지는 연관되어 있는 로직들을 결합해서 메소드라는 완제품을 만드는 것이다. 메소드를 사용하면 코드의 양을 극적으로 줄일 수 있고, 메소드 별로 기능이 분류되어 있기 때문에 필요한 코드를 찾기도 쉽고 문제의 진단도 빨라진다.

그런데 프로그램 성능이 높아지면서 메소드의 양이 늘어나, 다시 이전의 메소드가 없던 시절로 돌아가게 되었다. 그래서 나온 것이 객체지향 프로그래밍이다.

은닉화, 캡슐화

제대로된 부품이라면 그것이 어떻게 만들어졌는지 모르는 사람도 그 부품을 사용하는 방법만 알면 쓸 수 있어야 한다. 내부의 동작 방법을 단단한 베이스 안으로 숨기고 사용자에게는 그 부품의 사용방법만을 노출하고 있는 것이다.
이러한 컨셉을 정보의 은닉화, 캡슐화라고 부른다.

인터페이스

잘 만들어진 부품이라면 부품과 부품을 서로 교환 할 수 있어야 한다.

Comment and share

입력과 출력

string[ ] args

package living.coding; 

public class A8 {

    public static void main(String[] args) {
        System.out.println(args.length);

    }

}

main 메소드는 자바에서 특별한 의미를 가진 메소드이다. main메소드의 내용을 구현하면 자바 애플리케이션을 실행할 때 main메소드가 호출되면서 프로그램이 구동하게 되는 것이다. 이때 String [ ] args는 입력 값의 파라미터로 동작한다.

사용자의 입력을 받기

package living.coding;

import java.util.Scanner;

public class A9 {

    public static void main(String[] args) {
        
        Scanner sc = new Scanner(System.in);
        
        int i = sc.nextInt();
        System.out.println(i);
        sc.close();

    }

}

Rnu을 하게 되면 main메소드안의 Scanner라는 객체를 새로 만들 때 사용자가 입력한 값을 입력받아 생성한다. sc라는 객체는 nextInt라는 메소드를 통해 입력이 된다. nextInt는 정수 값만 입력이 가능하다.

Comment and share

Method

public static void main(String[ ] args) {

}

이것은 main이라는 이름의 메소드이다.

메소드의 정의와 호출

package living.coding;

public class A5 {
    public static void numbering() { // 정의
        int i = 0;
        while (i<10) {
            System.out.println(i);
            i++;
        } 
    }

    public static void main(String[] args) { // 호출
        numbering();
    }

}

메소드를 호출하게 되면 메소드를 정의한 부분이 실행되게 된다.
호출은 메소드의 이름 뒤 세미콜론을 적는 것으로 호출을 하고, 정의는 메소드의 이름 뒤 중괄호가 온다.
위 코드를 실행시키면 0123456789가 출력이 된다.

입력값

package living.coding;

public class A6 {
    public static void numbering(int limit) {
        int i = 0;
        while (i < limit) {
            System.out.println(i);
            i++;
        }
    }

    public static void main(String[] args) {
        numbering(5);
    }

}

입력값에 5를 넣흐면 limit변수에 5값이 들어가게 되고 실행값은 01234가 출력된다.
int limit은 매개변수라(parameter)하고 5는 인자(argument)라 한다.

출력값

return

package living.coding;

public class A7 {
    public static String numbering(int init, int limit) {
        int i = init;
        
        String output = "";
        while (i < limit) {
            output += i;
            i++;
        }
    
        return output;
    }
    
    public static void main(String [] args) {
        String result = numbering(1, 5);
        System.out.println(result);
    }
}

값은 1234를 출력하게 된다.
return뒤의 값은 그 메소드 밖에 배치하게 되고 실행중 이던 메소드는 중지된다.

Comment and share

Selection Sort

Selection Sort는 말그대로 선택정렬이다.
오름차순 또는 내림차순으로 정렬하는 것이다.

package living.coding;

public class A3 {

    public static void main(String[] args) {
        
          int [] num = {2,1,5,3,4};
          int i,j,temp;

         for (i=0;i<num.length-1;i++) {//1
            for (j=i+1;j<num.length;j++) {//2
                if (num[i]<num[j]) {//3
                    temp=num[i];
                    num[i]=num[j];
                    num[j]=temp;

                }
            }
        }   
    for (i=0;i<num.length;i++) {
        System.out.println(num[i]);
    }
}
  1. 비교할 시작점을 정해준다.
  2. 비교할 시작점 다음 index를 정해준다.
  3. 두개의 index를 비교한 후 서로 자리를 바꾸어 준다.

Comment and share

배열

정의

연관된 데이터를 모아서 관리하기 위해 사용하는 데이터 타입.

배열의 생성

변수의 데이터타입[] 변수 = {};

제어

배열제어
temp안의 각각의 값은 원소라 한다. 배열의 제어를 할 때는 index를 사용한다. index번호는 0부터 시작한다. 그러므로 temp[5]는 존재하지 않는다.
원소를 적지 않고 배열을 먼저 생성할 수도 있다.

변수의 데이터타입[] 변수 = new 변수의 데이터타입[index수];

변수의 크기

System.out.println(변수.length);

for-each

for each
이렇게 배열과 반복문을 같이 사용할 수도 있다.

Comment and share

char, String

자바에서는 char배열이 아닌 String클래슬를 이용해서 문자열을 처리하는 이유는 무엇일까?
String클래스는 char배열에 기능(메서드)을 추가한 것이다.
char배열과 String클래스의 한 가지 중요한 차이가 있는데, String객체(문자열)는 읽을 수만 있을 뿐 내용을 변경할 수 없다는 것이다.

public static void main(String[] args) {
    
    String str = "java";
    str = "8";
    System.out.println(str); // java8

    }

}

위처럼 String값이 바뀌는 것 같지만 새로운 문자열이 생겨 str이 새로운 주소값을 가르키는 것이다.

그리고 String문자열에서 하나의 문자만 꺼내오고 싶을 때 charAt이라는 메소드를 사용한다.
배열에서 “배열이름[index]”로 index에 위치한 값을 가져오는 것과 같다고 생각하면 된다.

public class Test {
public static void main(String[] args) {
    String str = "Hello";
    char ch = str.charAt(1);  // e
    }
}

Comment and share

복합 대입연산자

대입연산자와 다른 연산자가 함께 사용 되는 연산자로 변수를 중복해서 사용하는 것을 줄여주는 역할을 한다.(누적)
| 연산자 | 기능 |
|—|:—:|
| += | 두 항의 값을 더해서 왼쪽 항에 대입한다. |
| -= | 왼쪽 항에서 오른쪽 항을 뺴서 그 값을 왼쪽 항에 대입한다. |
| *= | 두 항의 값을 곱해서 왼쪽 항에 대입한다. |
| /= | 왼쪽 항을 오른쪽 항으로 나누어 그 몫을 왼쪽 항에 대입한다. |
| %= | 왼쪽 항을 오른쪽 항으로 나누어 그 나머지를 왼쪽 항에 대입한다. |

예시

+=

복합대입연산자1

-=

복합대입연산자2

*=

복합대입연산자3

/=

복합대입연산자4

%=

복합대입연산자5

Comment and share

반복문

while

while(최대값){
    실행값
    }

while문은 몇번 연동되는지 제한을 두지 않을 때 주로 쓴다.

for

for(변수초기값;최대값;증가값){
    실행값
    }

do ~ while

do{
    실행값
} while (최대값);

Comment and share

Hyeon Soo Ahn

author.bio


author.job