배열과 포인터의 관계배열의 이름도 포인터이다. 단, 그 값을 바꿀 수 없는 '상수 형태의 포인터'이다. 즉 배열 변수는 어떠한 값으로도 바꿀 수 없다. 포인터 변수와의 차이도 이것뿐이다. 이 것은 그냥 배경지식으로 알고 가고 다음 예제를 통해 배열의 값과 주소를 보자 #include int main() { // 배열 int arr[3] = { 5, 10, 15 }; printf("arr = %d\n", arr); for (int i = 0; i
포인터 이해하기 C언어는 포인터를 이용해 메모리에 직접 접근이 가능하다 그래서 Love레벨 언어의 특성을 가진다고 말한다. 메모리에 직접 접근이 가능하게 하려면 주소값을 저장할 변수가 필요한데 이것이 포인터 변수이다. 다음 코드를 보며 이해 해보자 #include int main(void){ int num = 7; int * pnum; pnum = # return 0;}cs int * pnum 이 바로 주소값을 저장할 포인터 변수이다. pnum은 변수명이고 int는 int형 변수의 주소값을 저장한다는 것이다.pnum = &num에서 &num은 num의 주소값이고 이 값을 pnum에 대입한 것이다. &연산자는 피 연산자의 주소값을 반환하는 연산자이다. 저 위에코드를 한줄로 표현하면 "포인터 변수 p..
Dao의 분리 이유개발자가 객체를 설계할 떄 가장 염두에 둬야 할 사항은 바로 미래의 변화를 어떻게 대비할 것인가 이다. 왜냐하면 오브젝트에 대한 설계와 이를 구현한 코드가 변하기 때문이다. 만약 2명의 개발자에게 동일한 기능 변경을 요청했다고 하자. 그런데 한 명은 단 몇줄의 코드만 수정하고 다른 개발자는 5시간이 걸렸다. 어떻게 변경이 일어날 때 필요한 작업을 최소화할까? 그것은 분리와 확장을 고려한 설계가 있었기 때문이다. 변화가 한 번에 한 가지 관심에 집중돼서 일어난다면, 우리가 준비해야 할 일은 한가지 관심이 한 군데에 집중되게 하는 것이다. 즉 관심이 있는 것끼리는 모으고, 관심이 다른 것은 따로 떨어져 있게 하는 것이다.프로그래밍의 기초 개념중에 관심사의 분리(Separation of Co..
스프링이란스프링은 자바 엔터프라이즈 애플리케이션 개발에 사용되는 애플리케이션 프레임워크다. 애플리케이션 프레임워크는 애플리케이션 개발을 빠르고 효율적으로 할 수 있도록 애플리케이션의 바탕이 되는 틀과 공통 프로그래밍 모델, 기술 API를 제공해준다. 스프링을 이해하기 위한 방법스프링은 자바를 기반으로 한 기술이다. 스프링이 자바에서 가장 중요하게 가치르르 두는 것은 바로 객체지향 프로그래밍이 가능한 언어라는 점이다. 스프링이 가장 관심을 많이 두는 대상은 오브젝트다. 스프링을 이해하려면 먼저 오브젝트에 깊은 관심을 가져야 한다. 오브젝트에 대한 관심은 오브젝트의 기술적인 특징과 사용 방법을 넘어서 오브젝트의 설계로 발전하게 된다. 객체지향 설계(object oriented design)의 기초와 원칙을 ..
스트림과 채널의 차이충분히 큰 버퍼의 사용은 네트워크 프로그램의 성능에 가장 큰 영향을 미치는 부분이다. 그래서 스트림을 항상 버퍼링할 것을 권장했다. 버퍼는 버퍼링 스트림에서와 같이 단순한 바이트 배열로도 표현될 수 있다. 프로그래밍 관점에서 스트림과 채널의 가장 큰 차이점은 채녈은 블록 기반인 데 반해 스트림은 바이트 기반이다. 스트림은 순서대로 한 바이트씩 제공하도록 설계하였다. 단지 성능을 위해 바이트 배열을 전달할 수는 있지만, 기본 개념은 한 번에 1바이트 데이터를 전달하는 것이다. 반면에 채널은 버퍼 안에 있는 데이터의 블록을 전달한다. 바이트는 채널에서 읽고 쓰기 전에 먼저 버퍼에 저장되어야 한다. 그리고 데이터는 한 번에 하나의 버퍼씩 읽고 쓴다. 스트림과 채널/버퍼의 두 번째 큰 차이점..
NIO(Nonblock Input/Output) 개요 일반적으로 네트워크의 속도는 컴퓨터의 CPU, 메모리, 심지어 디스크의 속도와 비교해도 매우 느리다. 이러한 상황에서 나오는 현상중 상대적으로 느린 네트워크를 엄청나게 빠른 CPU가 기다리는 것이다. CPU가 느린 네트워크를 기다리지 않고 네트워크보다 앞서 달리게 하기 위한 전통적인 자바의 해결 방안은 버퍼링과 멀티스레드를 결합하는 것이다. 다수의 스레드가 동시에 다수의 서로 다른 연결을 통해 보낼 데이터를 생성한다. 그리고 네트워크가 데이터를 보낼 준비가 될 때까지 해당 데이터들을 버퍼에 저장해 둔다. 그러나 멀티 스레드를 생성할 때 드는 오버헤드와 스레드 전환 시 발생하는 오버헤드를 무시할 수 없다. 그리고 각각의 스레드는 약 1메가 바이트의 메모..
자바 Date, SimpleDateFormat, Calendar API 1234567891011121314151617181920212223242526272829303132333435363738394041//Date클래스는 현재 날짜를 가져온다. 기준은 내컴퓨터 TimeZoneDate now = new Date();System.out.println(now); //SimpleDateFormat클래스는 Date 객체를 자기가 원하는 형식으로 바꿀수있다.SimpleDateFormat sdf = new SimpleDateFormat("yyyy년 MM월 dd일 hh시 mm분");System.out.println(sdf.format(now)); SimpleDateFormat sdfYear = new SimpleDat..
추상화(abstract) 정의추상화는 모델링이다. 추상화란 구체적인 것을 분해해서 관찰자가 관심 있는 특성만 가지고 재조합하는 것이라고 정리할 수 있다. 1. object(명사)- 물건, 물체 2. 개체(명사)- 전체나 집단에 상대하여 하나하나의 낱개를 이르느는 말 3. 객체- 세상에 존재하는 유일무이한 사물 4. 클래스- 분류, 집합. 같은 속성과 기능을 가진 객체를 총칭하는 개념 클래스 : 객체 = 펭귄 : 뽀로로 = 사람 : 김연아 = 쥐 : 미키마우스 세상에 존재하는 유일무이한 객체를 특성(속성 + 기능)에 따라 분류해 보니 객체를 통칭할 수 있는 집합적 개념, 즉 클래스(분류)가 나오게 된다. 객체는 유일무이(Unique)한 사물이다.클래스는 같은 특성을 지닌 여러 객체를 총칭하는 집합의 개념이..
객체지향은 인간 지향이다. 절차적/구조적 프로그래밍까지의 과정은 인간이 기계를 이해하려는 노력에서 크게 벗어나지 못했다. 특히 포인터의 개념은 기계 수준으로 눈높이를 낮추지 않으면 이해하기 매우 힘든 부분이다. 기존의 구주적 프로그래밍 언어에서 가장 중요한 것은 "함수" 였다. 함수는 코드를 논리적인 단위로 구분하고 분할해서 정복하자는 것이다. 즉 D&C(Divide and Conquer) 논리적인 단위로 나누어 블록화해서 작성하자는 것이다. 이런 논리적인 단위의 블록을 함수라고 한다. 우주 만물은 객체들의 합이다. 눈으로 보여지는 것, 손으로 만져지는 것, 머리속으로 상상되는 모든 것은 사물이다. 사물을 객체 라고 하고 영어로 Object라고 한다. 우리가 주변에서 사물을 인지하는 방식대로 프로그래밍을..
인터페이스의 역할인터페이스는 개발 코드와 객체가 서로 통신하는 접점 역할을 한다. 가장 큰 이유는 개발 코드를 수정하지 않고, 사용하는 객체를 변경할 수 있도록 하기 위해서 이다. 인터페이스 구조1[public] interface 인터페이스명 {....}cs 클래스는 필드, 생성자, 메소드를 구성 멤버로 가지는데 비해, 인터페이스는 상수와 메소드만을 구성 멤버로 가진다. 인터페이스는 객체로 생성할 수 없기 때문에 생성자를 가질 수 없다. 1234567891011121314interface 인터페이스명 { // 상수 타입 상수명 = 값 // 추상 메소드 타입 메소드명(매개변수,,) // 디폴트 메소드 default 타입 메소드명(매개변수,...) {} // 정적 메소드 static 타입 메소드명(매개변수,..
배열 이용하지 않고 달력 출력 1234567891011121314151617181920212223242526272829303132333435//Calendar 객체 생성(추상클래스 이기 때문에 getInstance로 객체를 생성한다.)Calendar cal = Calendar.getInstance(); // 1~12 월 for(int month=0; month