전체 글 669

[ JAVA ] 다형성

한 번의 코딩으로 여러 개의 객체를 생성할 수 있는 원리가 '다형성(polymorphism)'이다. 상속과 같이 불필요한 코드 사용을 줄이는 중요한 개념이다. 개인적으로 다형성의 의미는 참조변수에 얼마나 다양한 생성자를 받을 수 있냐? 출처 입력 라고 생각한다. 참조변수란 Heap영역에 생성된 객체의 주소를 담는 변수다. 주소는 new(연산자)와 생성자()(피연산자)를 통해 산출된다. 그러므로 하나의 코드로 다양한 객체를 만든다의 의미는 한 가지 참조타입(클래스)의 변수에 얼마나 다양한 생성자를 담을 수 있느냐?의 의미인 것이다. 다형성은 기본적으로 2 가지 경우가 있다. 1. 한 가지 클래스 타입에 매개변수가 서로 다른 생성자 출처 입력 이 경우는 이전 포스팅에 구체적으로 다룬 적이 있다. [ JAVA..

JAVA/JAVA Basic 2021.06.18

[ JAVA ] JAVA와 C언어의 차이

​ ​ ​ ​ 이것은 C언어로 작성된 한 개의 파일이다. ​ C는 한 개의 파일 안에 수 백, 수 천줄의 코딩을 한다. 별다른 경계점이 없다. 그냥 위에서 아래로 쭉 코딩한다. 파일을 분리하고 싶다면 자신이 원하는 부분을 분리해서 개발하면 된다. 이를 두고 '절차지향언어'라고 한다. ​ 하지만 JAVA는 엄격하다. 자바는 개발자 마음대로 개발하면 안 된다. 자바는 클래스 단위로 개발한다. ​ ​ 클래스가 100개가 있다면 그중 99개는 라이브러리 클래스이고 1개는 실행 클래스이다. 1개의 클래스를 '실행(RUN)시키고' 그때 그때 필요한 라이브러리 클래스를 로딩시킨다. ​ ​ C언어 로딩 ​ ​ ​ C언어 파일 로딩 ​ ​ C는 프로그램이 RUN되기 전에 C 실행파일을 위부터 아래로 쭉 읽으며 함수를 코..

JAVA/JAVA Basic 2021.06.18

[ JAVA ] 상속(Inheritance)

상속을 공부하면서 JAVA를 조금 더 이해할 수 있었다. 상속의 목적은 불필요한 코드 사용을 줄이는데에 있다. '자동차' 클래스는 A라는 특징을 가진다. 테슬라도 자동차 브랜드이다. 그래서 테슬라는 A + α 특징을 가진다. 자동차가 테슬라뿐이라면 그다지 낭비가 되지 않겠지만, 자동차는 도요타, 현대, 기아, 볼보... 여러 브랜드가 있다. 브랜드마다 A라는 특징을 공통으로 갖고 이를 코드로 구현하면 중복되는 코드가 정말 많을 것이다. 이를 방지하기 위해 '상속'이라는 개념을 사용한다. public class Car { int speed; public void speedUp() { speed += 1; } public final void stop() { System.out.printl..

JAVA/JAVA Basic 2021.06.18

[ JAVA ] 싱글톤패턴(singleton) 그리고 final

static의 목적은 '공용성'이다. 그리고 static을 활용한 패턴 중 하나가 '싱글톤 패턴'이다. 그러므로 static을 토대로 만든 싱글톤 패턴의 목적 또한 '공용성'이다. 무분별한 객체 생성을 막고 단 한 개만 생성해서 이를 공유하는 것이다. 사무실에 프린터를 한 대만 설치하는 개념이라 생각하면 된다. 직원마다 프린터를 설치하면 돈 낭비이듯, 공용 가능한 객체를 여러 개 생성하면 메모리 낭비이다. 싱글톤 패턴 일단 무분별한 객체 생성부터 막아야 한다. 객체생성은 new 연산자 + 생성자() 로 이루어진다. 생성자()를 private로 설정하여 접근제한을 둔다. public class Singleton { private static Singleton slt = n..

JAVA/JAVA Basic 2021.06.18

[ JAVA ] static 알아보기

JAVA는 객체지향언어다. 객체들은 데이터를 주고받으며 대화를 한다. 하지만 데이터 중에서도 '공용성'이 높은 데이터들이 있다. 예를들어 테슬라가 만들어내는 차는 모두 '전기차'이다. 그러므로 테슬라가 만들어내는 차들은 [ Strig cartype = "Electronic"; ] 속성을 가져야한다. 테슬라가 차 100대를 생성했다 가정하면 컴퓨터 메모리 Heap 영역에 100대의 객체가 생성될 것이다. 이는 메모리에 cartype 필드 또한 100개가 생성된다는 의미다. 즉, 100개의 cartype 필드 안에는 모두 똑같은 "Electronic" 문자열 리터럴을 가리키는 주소 데이터가 저장된다는 의미다. 얼마나 비효율적인가? 이와 같이 공용성이 높은 데이터는 static처리를 해서 쓸데없는 메모리 낭비..

JAVA/JAVA Basic 2021.06.18

[ JAVA ] 객체의 생성과 호출

객체 생성 연산자 : new 객체 접근 연산자 : . (도트) 이 두 가지만 알아도 객체의 많은 부분을 알 수 있다 생각한다. new 객체는 Heap 영역에 생성된다. Heap 영역에 객체생성을 지시하는 연산자가 new이다. Studuent [참조타입] std [참조변수] = new Student() [생성자]; 참조변수는 참조타입에 맞는 객체의 주소를 저장하는 변수다. new 연산자는 참조타입에 맞는 클래스의 생성자를 토대로 Heap 영역에 객체를 생성한다. 그리고 해당 객체의 주소를 return하여 = 연산자를 통해 참조변수에 저장한다. 생성자 생성자는 일반적으로 매개변수를 받아 객체의 필드값을 초기화하는데 사용된다. 생성자는 리턴타입이 없고 클래스의 이름과 동일하게 설정된다. 생성자는 굳이 코드로 ..

JAVA/JAVA Basic 2021.06.18

[ JAVA ] 열거타입(enumeration type)

열거 타입은 이름마저 생소하다. 열거타입을 사용하는 이유는 무엇일까? 간단히 예를 들어보겠다. '김철수'라는 사람이 있다. 철수는 회사에서 '김대리'라 불리지만 집에서는 '아빠'라 불린다. 그리고 술만 마시면 쩔뚝거리며 걸어서 친구들 사이에서는 '김철뚝'이라고 불린다. 이렇게 '김철수'라는 사람은 상황에 따라 불리는 이름이 다르다. 열거 타입은 하나의 대상이 상황에 따라 다른 값으로 바뀔 필요가 있을 때, 사용하면 간편한 코딩을 할 수 있게 도와준다. 대표적으로, 스레드의 상태(State)는 열거 타입으로 표현된다. 스레드는 한 개지만, 스레드가 상황에 따라 표현되는 상태는 NEW, RUNNABLE, WAITING, TIMED_WAITING, BLOKED, TERMINATED 와 같이 다양하다. 이처럼 ..

JAVA/JAVA Basic 2021.06.18

[ JAVA ] String args[] 존재 이유

public class StringArgs { public static void main(String[] args) { // TODO Auto-generated method stub System.out.println(args[0]); System.out.println(args[1]); System.out.println(args[2]); } } String[] args는 무엇일까? args는 arguments의 약자로 '인수'(파라미터)라는 의미다. String[] args의 존재 이유는 main 메소드의 static에서 찾을 수 있다. main 메소드는 static으로 선언된 정적 메소드이다. 정적 메소드(Static) 클래스의 메소드 사용법은 두 가지로 나뉜다. 1. 객체 생성 후 메소드 사용 가장 기..

JAVA/JAVA Basic 2021.06.18

[ JAVA ] 참조타입(reference type)

자바 변수 타입에는 두 가지가 있다. 원시 타입(primitive) and 참조 타입(referece) 변수에 '값'을 넣으면 원시 타입이다. 변수에 '주소'를 넣으면 참조 타입이다. 변수에 주소를 넣는 이유가 무엇일까? 출처 입력 JVM은 메모리를 할당받고 메모리 영역을 크게 3가지로 나눈다. 메소드 영역은 객체 생성을 위한 설계도인 클래스를 저장한다. HEAP 영역은 그 클래스를 토대로 만들어진 객체를 저장한다. STACK 영역은 한 스레드(main())가 시작될 때 그 스레드의 흐름에 따라 생성되는 변수를 임시 저장한다. STACK 영역은 스레드가 시작되어야 메모리가 할당된다. 스레드가 얼마나 클지 언제 시작될지도 모르는 영역을 큰 영역으로 잡아놓으면 메모리 낭비다. 그러므로 STACK 영역은 크지..

JAVA/JAVA Basic 2021.06.18

[ JAVA ] 이클립스 Failed to init ct.sym 에러 해결 (feat. JAVA SE15) (프로젝트 생성 에러)

이클립스를 설치하고 프로젝트를 생성하자마자 프로젝트에 에러가 난다. Failed to init ct.sym ~~ 이 경우는 이클립스가 JRE 경로를 제대로 인식하지 못해서 발생한다. '이클립스 인스톨러'로 이클립스를 설치하는 과정에서 JVM 경로를 설정할 때 jdk15로 경로를 설정하면 에러가 발생한다. 하지만 jdk14로 경로를 설정하면 에러가 발생하지 않는다. jdk15가 2020.9월에 나온 최신 버전이라 이클립스 인스톨러로 설치 시 호환에 문제가 있는게 아닐까 생각한다. (이유를 모르겠다...) 어쨌든 이런 경우 해결할 수 있는 방법이 세 가지가 있다. 첫 번째 방법 Window 탭에 들어가 Prefereces로 들어간다. java 속성에 installed JREs를 클릭하면 이런 창이 나온다. ..

JAVA/JAVA Basic 2021.06.18