You admit you are a beginner, so we'll start with an analysis of what you've proposed. When you say
\def\<#1: #2: #3\>{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
you are defining a macro named \<, meaning that your .tex file must contain this token in order to invoke the macro. Further, the syntax you've defined says that your .tex input must invoke the macro with the following (very restrictive syntax): \<FIRSTARG:SPACE SECONDARG:SPACE THIRDARG\>. If you leave out the spaces, compilation will fail with an error. If any of the arguments themselves contain a space or colon, then that could likewise produce errors (or at list misplaced argument definitions).
So while you can define a macro this way, it seems not convenient for usage. More likely, you want the output to look a certain way, rather than requiring the typed input to appear a certain way. The normal way to define such a macro (in LaTex) for a 3-argument input would be \newcommand\macroname[3]{...macros to produce the desired output using inputs #1, #2, and #3...}. The invocation form is then \macroname{FIRSTARG}{SECONDARG}{THIRDARG}. In this way, braces delimit the inputs, which can now contain colons and spaces without ambiguity,
So if I defined \newcommand\colonangle[3]{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}, then I could obtain your desired first macro output with the syntax, for example, \colonangle{x}{y}{z}.
Now to your second example. Not only does it also create a macro named \< (which is a duplicate of the prior macro name, but now requiring a different input syntax), it requires you to use words like if and else in the input file. Instead, I propose a second macro definition, to avoid confusion, using a more standard input syntax.
\documentclass{article}
\usepackage{amssymb}
\newcommand\colonangle[3]{\langle #1\;:\if#2\empty\else\;#2\;\fi:\;#3\rangle}
\newcommand\arrowangle[3]{ \langle #1\; \lhd #2\; \rhd \;#3\rangle }
\begin{document}
$\colonangle{A}{B}{C} \ne \arrowangle{A}{B}{C}$
\end{document}

Should've mentioned, I'm a super novice.
– Musa Al-hassy Dec 21 '14 at 18:38\<can only have one definition at a time, you need to give a different macro a different name – David Carlisle Dec 21 '14 at 18:39\<with some look-ahead to choose different paths or to decompose a grabbed#1in\def\<#1\>, hence my question about the linked question. – Joseph Wright Dec 21 '14 at 18:40\def\<#1\>with further processing depending on#1but hard to guess. – David Carlisle Dec 21 '14 at 18:41\if#2\emptyis almost certainly not what you wanted to test (it tests if the first two tokens of#2are the same) – David Carlisle Dec 21 '14 at 18:50\if#2\emptyis really wrong! It doesn't do what the macro author believes it does. If#2isaait returns true. Unfortunately, bad programming techniques are common; this is one of them. – egreg Dec 21 '14 at 19:02\<x: yy: z\>; look and behold! – egreg Dec 21 '14 at 20:27