4월, 2020의 게시물 표시

[JAVA] 다형성(Polymorphism)

이미지
JAVA 다형성(Polymorphism) 다형성이란 하나의 메소드나 클래스가 있을 때 이것들이 다양한 방법으로 동작하는 것을 의미한다. 즉 다형성이란 동일한 조작방법으로 동작시키지만 동작방법은 다른것을 의미한다. overloading과 다형성 다형성의 쉬운 예로 오버로딩이 있다.  오버로딩은 같은 의미이지만 매개변수가 어떤 형태이고 어떤데이터 타입이냐에 따라서 다른 메서드가 호출되는 방식이다. 즉 같은 이름, 다른 동작방법이라고 볼 수 있기때문에 이것또한 다형성이다. 클래스와 다형성 아래의 코드를 보면 c1과 c2의 인스턴스 데이터타입이 상속받은 부모 클래스인것을 볼 수 있다.  이렇게 작성한 이유는 코드의 중복을 회피하면서도 각각의 인스턴스마다 서로 다른 원하는 결과값을 얻기 위해서이다. 각 인스턴스는 상속받은 상위클래스를 데이터타입으로 정의함으로서  상위클래스에 정의되어있는 setOprands메서드로 인자값을 전달하여 left와 rigth의 값을 초기화하고  각 인스턴스마다 선언된 다른 클래스 즉 각각의 상속받은 하위클래스를 호출하여 서로 다른 원하는 결과값을 출력하도록한다.  상위클래스에서 run메서드로 추상메서드를 호출하고 이렇게 호출된 추상메서드는 상위클래스를 상속받은  각각의 하위클래스에서 오버라이딩을 통해 추상메서드를 구현하여 서로 다른 원하는 결과 값을 출력할 수 있다. 이렇게 작성하는것이 제일 간단하지만 각각의 인스턴스마다 다른 데이터타입을 가지고 있다하더라도  excute메서드에 각각의 데이터타입으로 매개변수를 작성하여 인스턴스의 각각의 데이터를 전달해도 결과값을 동일하게 얻을 수 있다. 하지만 그렇게되면 코드의 중복이 발생하므로 위와같이 작성하는것이 좋을것같다. 인터페이스의 다형성 한 클래스가 여러개의 인터페이스를 상속받는다는것은 상속받은 클래스에서 인터페이스가 구현하는 기능을 모두 사용할 수 있다는것이다. 하지만 모든 기능을 사용하지않고 인터페이스로 구현된 기능중 어떠한 특정 기...

디자인 패턴(design pattern) 이란?

디자인 패턴(design pattern) 프로그래밍에는 반복되는 패턴이 존재한다. 이런 패턴들을 모아서 정리한것을 디자인 패턴이라고 한다. 시각적으로 멋져보이는 디자인이아니라 좋은 소프트웨어를 만들기 위한 설계로서 디자인이라는 표현을 사용한다.  디자인 패턴의 장점은 크게 두 가지이다.  하나는 좋은 설계를 단기간에 학습할 수 있다는 점이다. 다른 하나는 소통에 도움이 된다는 점이다. 설계방법을 토의하거나 전달할 때 설계방법에 따라 적절한 이름이 있다면 상호간에 생각을 일치시키는 데 큰 도움이 될것이다.

[JAVA] final

이미지
JAVA final final은 상속 / 변경을 금지하는 규제다. 값이 한번 정해진 이후에는 변수 내의 값이 바뀌지 않도록하는 규제다. final로 선언된 변수는 값을 재할당 할 수 없다. final로 선언된 메서드는 오버라이딩해서 사용 할 수 없다. final로 선언된 클래스는 상속 할 수 없다.

[JAVA] 오버로딩(overloading) vs 오버라이딩(overriding)

JAVA 오버로딩 vs 오버라이딩 오버로딩(overloading) : 기존에 없는 새로운 메서드를 정의하는것(new) 오버라이딩(overriding) : 재정의 또는 확장. 상속받은 메서드의 내용을 변경(재정의)하는 것(modify) 오버로딩(overloading) (생성자에서 주로 사용) 같은 메소드명으로 여러개의 기능을 만든다. 오버로딩 조건 1.메서드 이름이 같아야한다. 2.매개변수의 갯수 또는 타입이 달라야 한다. 3. 리턴형은 관계없다 오버라이딩(overriding) 상속받은 메서드의 내용을 변경(재정의)하는 것을 오버라이딩이라고 한다. 오버라이딩 조건 자손 클래스에서 오버라이딩하는 메서드는 조상 클래스의 메서드와 1. 반드시 상속관계여야 한다. 2. 이름이 같아야 한다.(메소드명이 동일) 3. 매개변수가 같아야 한다.(갯수와 순서, 데이터 타입) 4. 반환타입이 같아야 한다.(리턴형 동일) 5. 접근지정어는 확장, 축소할 수 없다. ( public > protected > default > private ) 오버라이딩은 부모클래스에 정의된 메서드를 상속받지않고 자식클래스에서 재정의하여 사용하는데 상황에 따라 부모클래스에 정의되어있는 메서드의 기본 동작은 그대로 사용하면서 부가적인 기능을 작성하고자 할 때 똑같은 코드를 작성하면 중복이 발생하므로 super.메서드명 으로 기본적으로 작성되어있던 기능을 상속받고 그 후에 추가적으로 변경하고자하는 기능을 추가, 수정 할 수 있다.

[JAVA] 클래스 메서드(static)와 인스턴스 메서드(instance)

JAVA 클래스 메서드(static)와 인스턴스 메서드(instance) 인스턴스 메서드는 클래스 맴버에 접근 할 수 있다. 클래스 메서드는 인스턴스 맴버에 접근 할 수 없다. static키워드와 함께 작성된 변수와 메서드는 static키워드를 사용하지 않는 변수와 메서드에 접근 할 수 없다. 반면에 static키워드 없이 작성된 변수와 메서드는 static변수와 메서드에 접근 할 수 있다. 1. 클래스를 설계할 때, 멤버변수 중 모든 인스턴스에 공통으로 사용될 변수와 메서드에 static을 붙인다. 2. 메서드 내에 인스턴스 변수를 사용하지 않으면 static을 사용하는것이 좋다. 3. 클래스 메서드(static 메서드)는 인스턴스 변수를 사용 할 수 없다.  4. 클래스 변수(static 변수는) 인스턴스를 생성하지 않아도 사용할 수 있다. 5. static메서드는 static변수 사용 가능 6. 인스턴스 메서드와 변수의 경우 new연산자로 메모리 할당시에만 사용가능하지만 클래스 메서드(static 메서드는) new연산자로 메모리 할당없이 사용가능. 컴파일과정에서 메모리 자동생성. 7. static메서드에서는 this 사용이 불가능하다. 하지만 new 연산자로 static메서드 안에 메모리를 할당하면 this 사용이 가능하다.

JVM 메모리 구조

JVM 메모리 구조 응용프로그램이 실행되면 JVM은 시스템으로부터 프로그램을 수행하는데 필요한 메모리를 할당받고 JVM은 이 메모리를 용도에 따라 여러 영역으로 나누어 관리한다.  그 중 3가지 주요 영역에는 method area, call stack, heap이 있다. 1. 메서드 영역(method area) 프로그램 실행 중 어떤 클래스가 사용되면 JVM은 해당 클래스의 클래스파일을 읽어서 분석하여 클래스에 대한 정보를 이곳에 저장한다. 이 때 클래스의 클래스 변수도 이 영역에 함께 생성된다. 2.힙(heap) 인스턴스가 생성되는 공간이다. 프로그램 실행 중 생성되는 인스턴스는 모두 이곳에 생성된다. 즉 인스턴스 변수들이 생성되는 공간이며 사용자 정의 데이터가 저장되는 공간이다. 3.호출스택(call stack) 호출스택은 메서드의 작업에 필요한 메모리 공간을 제공한다. 메서드가 호출되면 호출스택에 호출된 메서드를 위한 메모리가 할당되며 해당 메모리는 메서드가 작업을 수행하는 동안 지역변수(매개변수포함)들과 연산의 중간 결과등을 저장하는데 사용된다. 그리고 메서드가 작업을 종료하면 할당되었던 메모리 공간은 반환된다. - 메서드가 호출되면 수행에 필요한 만큼의 메모리를 스택에 할당받는다. - 메서드가 수행을 마치고 나면 사용했던 메모리를 반환하고 스택에서 제거된다. - 호출스택의 제일 위에 있는 메서드가 현재 실행중인 메서드이다. - 바로 아래있는 메서드가 바로 위의 메서드를 호출한 메서드이다.

[JAVA] 변수 초기화 및 조건문 오류

이미지
JAVA 변수 초기화 및 조건문 오류 값이 초기화 되지않았다는 오류가 발생하였다. 원인은 if만을 사용해서 조건문을 작성하였기 때문이다. if조건에 해당하면 결과값으로  score에 등급을 대입하지만 모든조건이 일치하지않을경우 조건문을 실행하지 않으므로 값이 할당되지 않아 값이 초기화 되지않았다는 오류를 발생한다. 이런경우 score에 값을 직접 임의로 작성해주던지 아니면 if ~ else문으로 작성하면 if조건문에 조건이 충족되지 않더라도 else문을 실행하면서 score값에 값을 할당하기 때문에 코드가 오류없이 정상적으로 작동한다.

[JAVA] 출력방법 pintln, print, printf

JAVA 화면출력 println ( 세로 출력 ) System.out.println("hello"); System.out.println("java"); hello java print ( 가로 출력 ) System.out.print("hello"); System.out.print("java"); hello java printf ( 서식이 있는 출력 ) %d => 정수 %f => 실수 %c => 문자 %s => 문자열 % 와 알파벳 사이의 숫자는 출력값의 간격 및 정렬 양수면 오른쪽 정렬(왼쪽칸 띄움)   ex) %5d 음수면 왼쪽 정렬(오른쪽칸 띄움)    ex) %-5d 0은 공백 0으로 출력    ex) %05d System.out.println("80 80 80 240 80.0 B"); System.out.printf("%5d%5d%5d%5d%5f%5c", 80, 80, 80, 240, 80.0, 'b'); 위 두줄은 결과값을 똑같이 출력한다. 첫번째 인자로 각 데이터에 대한 데이터타입과 간격등을 직접 입력하여 원하는데로 값을 출력할 수 있다. %는 데이터를 받는다는 것이고 숫자5는 각데이터의 간격 d, f, c 등은 해당부분에 들어오는 데이터 타입을 나타낸다. ---------------------------------------------------------------------------------------------------- System.out.printf("%12.2f", 80.55); 여기서 12의 경우 해당 값이 표현될 수 있는 총 자릿수 12자리를 의미한다. 여기서 .2의 경우 소수점 2자리까지 나타내준다는의미를 가지고있으며 출력값은 80.55이다 만약에 여기서 .1로 변경할 경우 소수점 1자리까지 나타내준다는 의미로 반올림되어 출력값이 80.6이 출력된다. ----------...

[JAVA] 클래스변수(class variable/Static Field), 인스턴수변수(instance variable/Non-Static Field)

JAVA 클래스변수(class variable), 인스턴수변수(instance variable) java에서의 클래스는 변수와 메서드를 그룹핑해서 가지고있는 묶음이다.  클래스는 일종의 설계도와 같은 역할을 한다. JAVA 클래스는 선언위치에 따른 변수의 종류가 존재한다. class안에 정의된 변수를 멤버변수라고하며 멤버변수는 클래스변수와 인스턴수변수 2가지로 나누어진다. 인스턴스변수(instance variable) = 각각의 클래스가 가지고있는 변수(개별적인 속성) -클래스 영역에 선언되며 클래스의 인스턴스를 생성할 때 만들어진다. 그렇게 때문에 인스턴스 변수의 값을 읽어오거나 저장하기 위해서는 먼저 인스턴스를 생성해야한다. 인스턴스 생성방법 => 클래스명 변수명 = new 클래스명(); -인스턴스는 서로 독립적인 저장공간 즉 각각의 메모리 공간을 생성해서 각각의 서로 다른 값을 갖는다. 인스턴스마다 고유한 상태를 유지해야하는 경우 인스턴스변수로 선언한다. 인스턴스변수는 인스턴스가 생성될 때 마다 생성되므로 인스턴스마다 각기 다른 값을 유지할 수 있지만, 클래스 변수는 모든 인스턴스가 하나의 저장공간을 공유하므로 항상 공통된 값을 갖는다. 다른 폴더에 있는 메소드의 경우 파일을 import해줘야 사용이 가능하다. main메서드 밖에서 선언된 메서드는 다른 클래스에서도 클래스이름.메서드명으로 사용이 가능하다. 또한 매개변수도 전달 가능하다. 클래스 변수(class variable) =공유변수라고도 하며 공통속성을 가지는 변수 (고정값으로 사용) -클래스 영역에 선언되며 클래스가 메모리에 올라갈때 생성된다.  static 클래스(클래스 변수)의경우 저장공간을 만들지 않더라도 컴파일러 과정중에 자동으로 저장공간을 만들어주지만 메모리 공간이 1개이기때문에 값을 1개만 저장가능하다. -클래스 변수는 인스턴스 변수와 달리 new연산자를 사용하여 인스턴스를 생성하지 않고도 언제라도 바로 사용할 수 있으며  참수변수명.클래스변수 ...

[JAVA] 메소드의 void, return

이미지
JAVA  메소드 / 메소드의 void, return 메서드는 크게 두부분 선언부와 구현부로 이루어져있다. 아래와 같은 형식으로 작성된다. int add(int a, int b)   =====> 선언부 {           int result = a + b;    ======> {}블럭 안 구현부     return result; } 메서드 add 앞에 int는 반환타입(출력) 즉 반환받고자하는 결과값의 데이터타입이다. 여기서 return한 result값은 int형의 값만 반환한다. 각각의 매개변수에는 데이터타입을 지정해줘 해당 데이터타입 이외의 값을 받지 못하도록 한다. 매개변수로 받게 될 데이터타입이 모두 동일하다 하더라도 int a, b 와 같은 형식으로 데이터타입을 생략할 수 없으로 각각의 매개변수마다 데이터타입을 작성해줘야 한다. 그리고 java에서 메소드는 값을 반환하거나 바로 출력하는 2가지 방식이 존재한다. 두 가지 방식에는return 과 void 방식이 있다. return 방식으로 작성된 경우 값을 반환하여 다른 메소드로 값을 전달하거나 출력할 수 있도록 돕는다.  return으로 반환된 값은 반환타입과 일치하거나 적어도 자동 형변환이 가능해야한다. 반면에 void로 작성된 메소드는 값을 전달하지않고 해당 메소드 안에서 값을 직접 출력한다. return방식의 경우 반환값의 타입을 메소드명 앞에 작성해준다. 매개변수로 들어오는 값또한 매개변수명 앞에 타입을 작성해주어야 한다. 그러면 메소드가 실행되면 결과값이 메소드명 앞에 작성한 데이터타입으로 반환된다. void방식의 경우 값을 반환하지않고 해당 메소드 안에서 값을 출력하기 때문에 데이터로 전달받는 매개변수에 타입을 작성하여 데이터를 받도록한다. 그러면 매개변수로 전달받은 데이터의 타입으로 값을 출력한다. return방식  void방식 위 두 코...

[JAVA] 지역변수와 전역변수

이미지
JAVA 지역변수와 전역변수 java는 블록레벨 스코프이다.  즉 { } 중괄호 안에 작성한 변수의경우 그 중괄호 안에서만 사용이 가능하다. 만약에 전역변수를 사용하고자한다면 public class로만 작성된 최상위 {}중괄호 안에 작성하면 된다. 사진1 사진2 사진1은 전역에 선언된 변수 a와 b이다. 그리고 이러한 전역변수를 method1과 method2에서 사용 가능하다. 각각의 메소드 안에서 a=5와 같이 작성하면 전역변수로 선언된 static double a의 값을 5로 변경할 수 있다.  반면에 각각의 메소드 안에서 double a = 5를 작성하면 지역변수로 새로운 a가 생성되어 전역에 선언된 변수의 값을 참조하거나 변경하지않고 해당 메소드의 { }중괄호 안에서만 유효한 지역변수가 생성된다. 사진2에서 main메소드안에 선언된 변수 a, b는 { }중괄호 안에서만 유효한 지역변수이므로 method1과 method2에서 사용이 불가능하여 에러가 발생한다. 즉 블록레벨 스코프를 가지고있다. 한가지 예시를 더 보면 main메서드안에 a메서드가 호출되면서 반복문의 증감연산자가 제대로 동작안하고 계속되서 0을 출력할것이라고 예측해볼 수 있다. 하지만 위의경우 숫자를 순차적으로 출력한다. 그럴 수 있는 이유는 a메서드 내에 선언된 i는 해당 메서드 안에서만 존재하는 지역변수이기 때문이다. 그러므로 반복문에 들어가더라도 반복문에 선언된 변수i에 영향을 주지 않으므로 번호를 순차적으로 결과값으로 출력할 수 있다.

JAVA 클래스(class)와 인스턴스(instance)

JAVA 클래스(class)와 인스턴스(instance) 클래스는 설계도라고 생각 할 수 있고 인스턴스는 제품이라고 생각할 수 있다. 클래스는 서로 연관된 데이터와 메소드를 묶어놓은 설계도(그룹)이다. 이러한 클래스를 가지고 new연산자와 생성자함수를 통해 각각의 변수에 클래스를가지고 만들어진 제품(인스턴스)를 담을 수 있다. 즉 인스턴스는 하나의 클래스를 복제해서 서로 연관된 데이터의 값과 메소드를 가진 복제본을 만드는것이다. 이렇게 인스턴스로 생성되는 클래스의경우 내부에서 static키워드를 사용하면 오류가 발생한다. 그이유는 클래스를 통해 생성된 인스턴스는 독립된 저장공간을 가지고있기때문이다.  static키워드는 공통으로 사용하고자하는 값 또는 메소드에 사용되는 키워드이기때문에 각각의 독립된 저장공간을 가지고있는 인스턴스에 사용할 수 없다. 인스턴스화가 가능한 클래스가 존재하고 불가능한 클래스가 존재한다. java api documentation에서 확인하기 java는 메소드로 구조를 잡고 메소드와 변수를 그룹핑해서 클래스로 구조를 잡고 클래스를 복제한 인스턴스를 통해 또다른 구조를 만드는식으로 코드를 작성해 나갈 수 있다.